home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-100 < prev    next >
Text File  |  1995-12-31  |  132KB  |  3,390 lines

  1. C.S.M.P. Digest             Sat, 10 Jun 95       Volume 3 : Issue 100
  2.  
  3. Today's Topics:
  4.  
  5.         Anyone doing lots of PPC assembly language?
  6.         Can one do custom controls w-o CDEFs?
  7.         Extracting data from AEDescs
  8.         Getting rid of Option-
  9.         How to disable Text Item ?
  10.         To OOP or not to OOP. That...
  11.         TransSkel 3.20 is available (CW 6 - SC++ 8)
  12.         malloc vs. NewPtr
  13.         newbie. How to get open file dialog box.
  14.  
  15.  
  16.  
  17. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  18. (pottier@clipper.ens.fr).
  19.  
  20. The digest is a collection of article threads from the internet newsgroups
  21. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  22. people who read news semi-regularly and want an archive of the discussions.
  23. If you don't know what a newsgroup is, you probably don't have access to
  24. it. Ask your systems administrator(s) for details. If you don't have access
  25. to news, you may still be able to post messages to the group by using a
  26. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  27. information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                                Sends you a summary of commands
  43.     subscribe csmp-digest Your Name     Adds you to the mailing list
  44.     signoff csmp-digest                 Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu.
  51.  
  52. -------------------------------------------------------
  53.  
  54. >From junkster@chinook.halcyon.com (James Hague)
  55. Subject: Anyone doing lots of PPC assembly language?
  56. Date: 15 May 1995 01:20:52 GMT
  57. Organization: Northwest Nexus, Inc. - Professional Internet Services
  58.  
  59. I know that you'd have to be an idiot to write lots of PPC assembly 
  60. (other than for code generators) and I know that Apple recommends against 
  61. it, but still:  Is anyone out there writing significant portions of an 
  62. app or game or whatever in PowerPC assembly?  I'd love to hear what you 
  63. have to say.
  64.  
  65. James Hague
  66. junkster@halcyon.com
  67.  
  68. +++++++++++++++++++++++++++
  69.  
  70. >From allender@prairienet.org (Mark W. Allender)
  71. Date: 16 May 1995 20:27:29 GMT
  72. Organization: Prairienet, the East-Central Illinois Free-Net
  73.  
  74. sandor (sbrb@cats.ucsc.edu) wrote:
  75.  
  76. : What is needed is an (inline) PPC assembler from Metrowerks, asap.
  77.                        ^^^^^^^^
  78.  
  79. This is *key*.  Not only for PPC and 68K as well.  I really dislike
  80. having only function level asm available to me.
  81.  
  82. PC compilers have had inline asm for a while.  This is one area of mac
  83. programming that needs to catch up.  (But I will say that CW's profiling
  84. is really boss!)
  85.  
  86. --
  87. -Mark Allender
  88. -Parallax Software
  89. -allender@prairienet.org
  90.  
  91. +++++++++++++++++++++++++++
  92.  
  93. >From pj@stacken.kth.se (Patrik Johansson)
  94. Date: Tue, 16 May 1995 22:01:24 +0200
  95. Organization: KTH
  96.  
  97.  
  98. > Only problem is the manuals. They do 64 bit implementations mixed
  99. > in with 32 bit implementations and 64 bit running in '32 bit mode'.
  100. > The notation can drive you crazy. But again, once you get the hang
  101. > of it, it all makes sense.
  102. > What is needed is an (inline) PPC assembler from Metrowerks, asap.
  103.  
  104. What is the best Reference book for PPC programming? Note, i am not looking
  105. for a talkative tutorial with lots of pictures etc, a reference manual!
  106.  
  107. Pj
  108.  
  109. +++++++++++++++++++++++++++
  110.  
  111. >From english@primenet.com (Lawson English)
  112. Date: 16 May 1995 21:57:28 GMT
  113. Organization: Primenet Services for the Internet (602)395-1010
  114.  
  115. Mark W. Allender (allender@prairienet.org) wrote:
  116. : sandor (sbrb@cats.ucsc.edu) wrote:
  117.  
  118. : : What is needed is an (inline) PPC assembler from Metrowerks, asap.
  119. :                        ^^^^^^^^
  120.  
  121. : This is *key*.  Not only for PPC and 68K as well.  I really dislike
  122. : having only function level asm available to me.
  123.  
  124. I don't see it as that big an issue. Sure, the Symantec in-line assembler 
  125. for 68K is nice (do they have one for PPC?), but with PPC code, I think 
  126. that I would PREFER to have function-level asm, as that way I don't have 
  127. to try and second-guess the compiler while its doing register-coloring 
  128. optimizations or somesuch.
  129.  
  130. I understand that CW 6 STILL doesn't have that PPC assembler? 
  131.  
  132.  
  133.  
  134. --
  135. - -----------------------------------------------------------------------------
  136. Lawson English                            __  __     ____  ___       ___ ____
  137. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  138.                                         /   / \  / / / / /__ /  \/ /___  /
  139. - -----------------------------------------------------------------------------
  140.  
  141. +++++++++++++++++++++++++++
  142.  
  143. >From junkster@coho.halcyon.com (James Hague)
  144. Date: 16 May 1995 19:50:48 GMT
  145. Organization: Northwest Nexus, Inc. - Professional Internet Services
  146.  
  147. In article <3paej2$npc@vixen.cso.uiuc.edu>,
  148. >James Hague (junkster@chinook.halcyon.com) wrote:
  149. >: I know that you'd have to be an idiot to write lots of PPC assembly 
  150. >
  151. >I don't understand what the taboo is on doing PPC assembly.  Assembly code
  152. >is assembly code in my book (aside from the obvious differences).
  153.  
  154. Heck, I don't have a problem with it.  In fact, I'd love to get my hands 
  155. on a decent PPC assembler so I could jump right in.  I've always found 
  156. assembly language programming to be fun.
  157.  
  158. My comments were mostly to calm the religious masses.  I've seen far too 
  159. many people get attacked for not bowing down to Apple.
  160.  
  161. Anyhow, what's available for doing PPC assembly?  MOPS and PowerMacForth 
  162. both have assemblers (MOPS is still a 68K system, though).  Codwarrior 6 
  163. was supposed to support it, but I haven't heard for sure.  The Fantasm 
  164. folk claim that v4 will generate PPC code, but that's likely a long way 
  165. off.  And there's the MPW assembler from Apple--ick.  
  166.  
  167. James Hague
  168. junkster@halcyon.com
  169.  
  170. +++++++++++++++++++++++++++
  171.  
  172. >From gamares@mailhost.ecn.uoknor.edu (Gabe Mares)
  173. Date: Tue, 16 May 1995 17:21:11 -0600
  174. Organization: University of Oklahoma
  175.  
  176. In article <sbrb-1605950744260001@sandor23.slip.crl.com>,
  177. sbrb@cats.ucsc.edu (sandor) wrote:
  178.  
  179. > What is needed is an (inline) PPC assembler from Metrowerks, asap.
  180.  
  181. Amen.  But not _only_ PPC.  We need 68K inline as well.  Something like
  182. asm68K {...} and asmPPC {...}.
  183.  
  184. Gabe
  185.  
  186. +++++++++++++++++++++++++++
  187.  
  188. >From english@primenet.com (Lawson English)
  189. Date: 16 May 1995 23:41:20 GMT
  190. Organization: Primenet Services for the Internet (602)395-1010
  191.  
  192. James Hague (junkster@coho.halcyon.com) wrote:
  193. [snitpt]
  194. : Anyhow, what's available for doing PPC assembly?  MOPS and PowerMacForth 
  195. : both have assemblers (MOPS is still a 68K system, though).  Codwarrior 6 
  196. : was supposed to support it, but I haven't heard for sure.  The Fantasm 
  197. : folk claim that v4 will generate PPC code, but that's likely a long way 
  198. : off.  And there's the MPW assembler from Apple--ick.  
  199.  
  200.  
  201. Word I have is that CW6 comes with PPCAsm in the MPW folder.
  202.  
  203. Ick indeed.
  204.  
  205. --
  206. - -----------------------------------------------------------------------------
  207. Lawson English                            __  __     ____  ___       ___ ____
  208. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  209.                                         /   / \  / / / / /__ /  \/ /___  /
  210. - -----------------------------------------------------------------------------
  211.  
  212. +++++++++++++++++++++++++++
  213.  
  214. >From english@primenet.com (Lawson English)
  215. Date: 16 May 1995 23:52:33 GMT
  216. Organization: Primenet Services for the Internet (602)395-1010
  217.  
  218. Patrik Johansson (pj@stacken.kth.se) wrote:
  219.  
  220. : > 
  221. : > Only problem is the manuals. They do 64 bit implementations mixed
  222. : > in with 32 bit implementations and 64 bit running in '32 bit mode'.
  223. : > The notation can drive you crazy. But again, once you get the hang
  224. : > of it, it all makes sense.
  225. : > 
  226. : > What is needed is an (inline) PPC assembler from Metrowerks, asap.
  227.  
  228. : What is the best Reference book for PPC programming? Note, i am not looking
  229. : for a talkative tutorial with lots of pictures etc, a reference manual!
  230.  
  231.  _Optimizing PowerPC Code_ by Gary Kacmarcik is currently the only book 
  232. available. I've heard that there is a *compiler* book for PowerPC coming 
  233. soon.
  234.  
  235. You also have the 601/604/6xx User's Manuals from IBM and Motorola.
  236.  
  237.  
  238.  
  239.  --
  240. - -----------------------------------------------------------------------------
  241. Lawson English                            __  __     ____  ___       ___ ____
  242. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  243.                                         /   / \  / / / / /__ /  \/ /___  /
  244. - -----------------------------------------------------------------------------
  245.  
  246. +++++++++++++++++++++++++++
  247.  
  248. >From allender@prairienet.org (Mark W. Allender)
  249. Date: 17 May 1995 00:32:59 GMT
  250. Organization: Prairienet, the East-Central Illinois Free-Net
  251.  
  252. Lawson English (english@primenet.com) wrote:
  253. : James Hague (junkster@coho.halcyon.com) wrote:
  254. : : off.  And there's the MPW assembler from Apple--ick.  
  255.  
  256. : Ick indeed.
  257.  
  258. Not to sound naive (it is possible), but what is wrong with that assembler?
  259. It works fine for me.
  260.  
  261. --
  262. -Mark Allender
  263. -Parallax Software
  264. -allender@prairienet.org
  265.  
  266. +++++++++++++++++++++++++++
  267.  
  268. >From english@primenet.com (Lawson English)
  269. Date: 17 May 1995 01:20:17 GMT
  270. Organization: Primenet Services for the Internet (602)395-1010
  271.  
  272. Mark W. Allender (allender@prairienet.org) wrote:
  273. : Lawson English (english@primenet.com) wrote:
  274. : : James Hague (junkster@coho.halcyon.com) wrote:
  275. : : : off.  And there's the MPW assembler from Apple--ick.  
  276.  
  277. : : Ick indeed.
  278.  
  279. : Not to sound naive (it is possible), but what is wrong with that assembler?
  280. : It works fine for me.
  281.  
  282. Indeed it does. HOwever, it is really difficult to learn to use, IMHO, 
  283. and 1) requires that you have MPW and 2) that you know how to use MPW.
  284.  
  285. The documentation is "spotty" shall we say?
  286.  
  287.  
  288.  
  289. --
  290. - -----------------------------------------------------------------------------
  291. Lawson English                            __  __     ____  ___       ___ ____
  292. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  293.                                         /   / \  / / / / /__ /  \/ /___  /
  294. - -----------------------------------------------------------------------------
  295.  
  296. +++++++++++++++++++++++++++
  297.  
  298. >From english@primenet.com (Lawson English)
  299. Date: 17 May 1995 03:26:17 GMT
  300. Organization: Primenet Services for the Internet (602)395-1010
  301.  
  302. sandor (sbrb@cats.ucsc.edu) wrote:
  303.  
  304. : > I don't understand what the taboo is on doing PPC assembly.  Assembly code
  305. : > is assembly code in my book (aside from the obvious differences).
  306.  
  307. : Agreed !  In fact PPC assembly was a lot easier to learn and use
  308. : that 68K (let alone x86). It is a bit strange at first because of
  309. : being a load store architecture. But once over that it goes smoothly. 
  310.  
  311.  
  312. How are you at scheduling so that the pipelines remain full? What about 
  313. 604 vs 601 optimization?
  314.  
  315.  
  316. --
  317. - -----------------------------------------------------------------------------
  318. Lawson English                            __  __     ____  ___       ___ ____
  319. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  320.                                         /   / \  / / / / /__ /  \/ /___  /
  321. - -----------------------------------------------------------------------------
  322.  
  323. +++++++++++++++++++++++++++
  324.  
  325. >From dmatiske@degas.helios.nd.edu (david matiskella)
  326. Date: 17 May 1995 04:02:18 GMT
  327. Organization: University of Notre Dame
  328.  
  329. In article <3pbqcp$74o@news.primenet.com>, english@primenet.com (Lawson English) writes:
  330. |> sandor (sbrb@cats.ucsc.edu) wrote:
  331. |> 
  332. |> : > I don't understand what the taboo is on doing PPC assembly.  Assembly code
  333. |> : > is assembly code in my book (aside from the obvious differences).
  334. |> 
  335. |> : Agreed !  In fact PPC assembly was a lot easier to learn and use
  336. |> : that 68K (let alone x86). It is a bit strange at first because of
  337. |> : being a load store architecture. But once over that it goes smoothly. 
  338. |> 
  339. |> 
  340. |> How are you at scheduling so that the pipelines remain full? What about 
  341. |> 604 vs 601 optimization?
  342. |> 
  343. |> 
  344. |> --
  345. |> -------------------------------------------------------------------------------
  346. |> Lawson English                            __  __     ____  ___       ___ ____
  347. |> english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  348. |>                                         /   / \  / / / / /__ /  \/ /___  /
  349. |> -------------------------------------------------------------------------------
  350. I assume he doing it by hand.  For 601/603/604 optimization you
  351. have to either pick one or pick the code which gives acceptable
  352. performance on all three. Nothing new. Optimum pentium code isn't
  353. optimum 486 code. Similiar Optium 68K is not the same as otptium
  354. 68040 code. It's not some new problem. Personally I would
  355. optimize for the 601 since A) you can buy a system that uses
  356. it, B) it's most likely going to be the slowest of the 3. 
  357.  
  358. +++++++++++++++++++++++++++
  359.  
  360. >From pchang@csd-d-3.Stanford.EDU (The Weasel)
  361. Date: 17 May 1995 06:36:23 GMT
  362. Organization: Computer Science Department, Stanford University, CA USA.
  363.  
  364. In article <3pbj0h$s4k@news.primenet.com>,
  365. Lawson English <english@primenet.com> wrote:
  366. > The documentation is "spotty" shall we say?
  367.  
  368. Huh? I found the documentation to be fine. At least it was all in one
  369. place as opposed to the rest of the mpw docs. One thing that made me
  370. grumpy though was that it was basically the ibm assembler rather than
  371. following the lead of the previous 68k mpw assemblers with directives
  372. like while etc.
  373.  
  374. This is, of course, all my own opinion.
  375.  
  376. Peter
  377. --
  378. ObURL:       <a href="http://xenon.stanford.edu/~pchang/bhh.html">
  379. ObQuote:     Chi non ha paura di morire muore una volta sola.
  380.                                 -- Giovanni Falcone
  381.  
  382.  
  383. +++++++++++++++++++++++++++
  384.  
  385. >From sbrb@cats.ucsc.edu (sandor)
  386. Date: Wed, 17 May 1995 08:03:27 -0800
  387. Organization: CRL Dialup Internet Access
  388.  
  389. In article <3pbqcp$74o@news.primenet.com>, english@primenet.com (Lawson
  390. English) wrote:
  391.  
  392. > How are you at scheduling so that the pipelines remain full? What about 
  393. > 604 vs 601 optimization?
  394.  
  395. The IBM/Motorola manuals (e.g. PowerPC 604 RISC Microprocessor User's
  396. Manual) contain detailed examples of how the pipeline works. They also
  397. have info on how to schedule your code (see for example section 6.6 in
  398. the 604 User's manual). There is nothing obscure or tricky about it.
  399. >From what I can tell, it is mostly common sense once you see how the
  400. pipelines work -- although I'm sure that experience helps. I also go
  401. through the CW compiler output and also look in ROM to see what IBM 
  402. and Apple do. Would appreciate seeing more informative examples posted 
  403. here by the experts (e.g. last year Tim Olson at Apple Computer/Somerset 
  404. posted several interesting code examples).
  405.  
  406. There are some differences between the 601 and 604 but they don't seem
  407. to be a major matter. What I have done is concentrate on the 604 (there
  408. are none of the old POWER ops to tempt one, e.g. when a 64 bit divide is
  409. needed). And the manual is more readable. In fact the 604 (on paper) looks
  410. like a really great chip -- with its 3 integer pipelines, etc.
  411.  
  412. But at present don't have a 604 to program ! Am waiting patiently. Believe 
  413. that one facility it has, that the 601 doesn't, is a "nanosecond" timer 
  414. (used via the mftb op). Am I correct about this ? If so, this could help 
  415. with checking how well ones code is doing. Does anyone know about this ?
  416. I found the manuals rather inconclusive.
  417.  
  418. Nick Burgoyne           <sbrb@cats.ucsc.edu>            17 May 1995
  419.  
  420. +++++++++++++++++++++++++++
  421.  
  422. >From english@primenet.com (Lawson English)
  423. Date: 17 May 1995 16:37:47 GMT
  424. Organization: Primenet Services for the Internet (602)395-1010
  425.  
  426. Mark W. Allender (allender@prairienet.org) wrote:
  427. : James Hague (junkster@chinook.halcyon.com) wrote:
  428. : : I know that you'd have to be an idiot to write lots of PPC assembly 
  429.  
  430. : Why?
  431.  
  432. : : (other than for code generators) and I know that Apple recommends against 
  433. : : it, but still:  Is anyone out there writing significant portions of an 
  434. : : app or game or whatever in PowerPC assembly?  I'd love to hear what you 
  435. : : have to say.
  436.  
  437. : Apple recommends against a lot of things -- and I mostly ignore those
  438. : things that I believe that I should.  With that said:
  439.  
  440. Actually, Apple recommends that you code it in C that is optimized for 
  441. algorithms and data structures first and benchmark that to see where you 
  442. need to go to assembler. And once you've gone to assembler, make sure 
  443. that it really IS faster than C that has been optimized for algorithms 
  444. and data structures.
  445.  
  446. They dont' recommend that you not use assembler -only that you be sure 
  447. that assembler is actually faster.
  448.  
  449. : Parallax will probably be doing quite a bit of PPC assembly for Descent. 
  450. : We have to.  Otherwise, frame rate will be _slow_ -- and I mean really
  451. : slow, compared to what it could be.
  452.  
  453. Yer a better man than I, Gunga Din... Or are you worried about CopyBits 
  454. issues?
  455.  
  456. : I don't understand what the taboo is on doing PPC assembly.  Assembly code
  457. : is assembly code in my book (aside from the obvious differences).
  458.  
  459.  
  460. Folks are lazy, mostly, and RISC CPUs are designed to make compilers 
  461. efficient, so why bother when you don't have to?
  462.  
  463. If you have to, you have to.
  464.  
  465. What bottle-necks are you finding where assembler is that far superior to 
  466. C, BTW?
  467.  
  468. --
  469. - -----------------------------------------------------------------------------
  470. Lawson English                            __  __     ____  ___       ___ ____
  471. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  472.                                         /   / \  / / / / /__ /  \/ /___  /
  473. - -----------------------------------------------------------------------------
  474.  
  475. +++++++++++++++++++++++++++
  476.  
  477. >From junkster@chinook.halcyon.com (James Hague)
  478. Date: 17 May 1995 16:28:21 GMT
  479. Organization: Northwest Nexus, Inc. - Professional Internet Services
  480.  
  481. Mark W. Allender <allender@prairienet.org> wrote:
  482. >: : off.  And there's the MPW assembler from Apple--ick.  
  483. >
  484. >: Ick indeed.
  485. >
  486. >Not to sound naive (it is possible), but what is wrong with that assembler?
  487. >It works fine for me.
  488.  
  489. Possibly nothing.  Except that you have to buy and use MPW in order to 
  490. get it.
  491.  
  492. James Hague
  493. junkster@halcyon.com
  494.  
  495. +++++++++++++++++++++++++++
  496.  
  497. >From kevinw@reflective.com (Kevin Warne)
  498. Date: 17 May 1995 16:20:55 GMT
  499. Organization: Reflective Software
  500.  
  501. In article <3pb748$a61@news.primenet.com>, english@primenet.com (Lawson English) says:
  502. >I don't see it as that big an issue. Sure, the Symantec in-line assembler 
  503. >for 68K is nice (do they have one for PPC?), but with PPC code, I think 
  504. >that I would PREFER to have function-level asm, as that way I don't have 
  505. >to try and second-guess the compiler while its doing register-coloring 
  506. >optimizations or somesuch.
  507.  
  508. Watcom C++ (for x86) has great support for this sort of thing.  You
  509. specify the registers/memory that you read/write in your inline assembly
  510. and you specify calling conventions in terms of register setup/return
  511. (so it's even type-safe!) and their optimizer will generate code to 
  512. match.  Pity that more compilers don't support this level of inline
  513. assembly...
  514.  
  515. Regards,
  516. Kevin
  517.  
  518. ____
  519. Kevin Warne / kevinw@reflective.com / DDD +1(604)683-0977 / FAX +1(604)598-9546
  520. Reflective Software Corporation
  521. 2660 Estevan Ave, Victoria, BC, CANADA  V8R 2T4
  522. Warne's Garbage Collector (WGC) = Fastest C++ heap manager, email for demo app
  523.  
  524. +++++++++++++++++++++++++++
  525.  
  526. >From philip@cs.uct.ac.za (Philip Machanick)
  527. Date: 18 May 1995 06:44:34 GMT
  528. Organization: Computer Science Dept, Wits University
  529.  
  530. In article <3pd875$90q@news1.halcyon.com>, junkster@chinook.halcyon.com
  531. (James Hague) wrote:
  532.  
  533. >>Possibly nothing.  Except that you have to buy and use MPW in order to 
  534. >get it.
  535.  
  536. Or CW6 from what I hear -- though it probably still runs in MPW.
  537. -- 
  538. Philip Machanick
  539. Computer Science Department, University of the Witwatersrand
  540. 2050 Wits, South Africa
  541. philip@cs.wits.ac.za  27(11)716-3309 fax 339-7965
  542.  
  543. +++++++++++++++++++++++++++
  544.  
  545. >From jmunkki@beta.hut.fi (Juri Munkki)
  546. Date: 18 May 1995 18:03:44 GMT
  547. Organization: Helsinki University of Technology
  548.  
  549. In article <3paej2$npc@vixen.cso.uiuc.edu> allender@prairienet.org (Mark W. Allender) writes:
  550. >James Hague (junkster@chinook.halcyon.com) wrote:
  551. >: I know that you'd have to be an idiot to write lots of PPC assembly 
  552. >
  553. >Parallax will probably be doing quite a bit of PPC assembly for Descent. 
  554. >We have to.  Otherwise, frame rate will be _slow_ -- and I mean really
  555. >slow, compared to what it could be.
  556. >
  557. >I don't understand what the taboo is on doing PPC assembly.  Assembly code
  558. >is assembly code in my book (aside from the obvious differences).
  559.  
  560. I agree quite totally. If a person wants to use assembly language, then
  561. he/she should be allowed to use it. At least MWC doesn't seem to be able
  562. to generate very fast code for the PPC... I tried contacting tonyn@tiac.net
  563. about his assembler, but he hasn't replied. I guess I could use PPCAsm,
  564. since I have access to ETO disks, but I'm not very enthusiastic about
  565. touching MPW.
  566.  
  567. I still think that MetroWorks C or Symantec C should provide inline
  568. PPC and 68020 assembly (MWC only does plain 68K). If you compare the
  569. task of writing a C compiler and that of writing an assembler, the
  570. assembler seems trivial in comparison. I just want to be able to
  571. access my C structures and variables from assembly, so an inline
  572. assembler (like the one in Think C) is the ideal solution.
  573.  
  574. On the 68K, my C versions are about twice as slow as the optimized
  575. assembly language. On the PowerPC things are slightly better because
  576. it has more registers, but I still see a lot of room for improvement.
  577.  
  578. -- 
  579. Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware lunch.
  580. http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  581.  
  582. +++++++++++++++++++++++++++
  583.  
  584. >From phils@bedford.symantec.com (Phil Shapiro)
  585. Date: Thu, 18 May 1995 16:38:21 -0400
  586. Organization: Symantec Corp.
  587.  
  588. In article <3pd875$90q@news1.halcyon.com>, junkster@chinook.halcyon.com
  589. (James Hague) wrote:
  590.  
  591. | Mark W. Allender <allender@prairienet.org> wrote:
  592. | >: : off.  And there's the MPW assembler from Apple--ick.  
  593. | >
  594. | >: Ick indeed.
  595. | >
  596. | >Not to sound naive (it is possible), but what is wrong with that assembler?
  597. | >It works fine for me.
  598. | Possibly nothing.  Except that you have to buy and use MPW in order to 
  599. | get it.
  600.  
  601. Actually, the SDA #3 CD includes a pre-release copy of an SPM integrated
  602. version of Apple's PPCAsm assembler. It's a drop-in translator for the 8.0
  603. SPM.
  604.  
  605.    -phil
  606.  
  607. +++++++++++++++++++++++++++
  608.  
  609. >From Heiner Wolf <wolf@informatik.uni-ulm.de>
  610. Date: 18 May 1995 16:02:40 GMT
  611. Organization: University of Ulm, Germany
  612.  
  613. > I know that you'd have to be an idiot to write lots of PPC assembly
  614. > (other than for code generators) and I know that Apple recommends against
  615. > it, but still:  Is anyone out there writing significant portions of an
  616. > app or game or whatever in PowerPC assembly?  I'd love to hear what you
  617. > have to say.
  618.  
  619. We are coding the kernal of a JPEG image decompressor in assembler.
  620.  
  621. Yes, I know. The compilers are so good and it is not neccessary. But if I can
  622. spare a single instruction per color component per pixel at 20 320x240 frames
  623. per second then its worth the effort. 
  624.  
  625. -- 
  626. Klaus H.Wolf
  627. ethernet: 08:00:20:12:2a:01 
  628. internet: wolf@informatik.uni-ulm.de
  629.  
  630.  
  631. +++++++++++++++++++++++++++
  632.  
  633. >From rmcassid@uci.edu (Robert Cassidy)
  634. Date: Thu, 18 May 1995 16:53:33 -0700
  635. Organization: UC Irvine
  636.  
  637. In article <3pg260$n1i@nukkekoti.cs.hut.fi>, jmunkki@beta.hut.fi (Juri
  638. Munkki) wrote:
  639.  
  640. > In article <3paej2$npc@vixen.cso.uiuc.edu> allender@prairienet.org (Mark
  641. W. Allender) writes:
  642.  
  643. > >I don't understand what the taboo is on doing PPC assembly.  Assembly code
  644. > >is assembly code in my book (aside from the obvious differences).
  645.  
  646. > I agree quite totally. If a person wants to use assembly language, then
  647. > he/she should be allowed to use it. At least MWC doesn't seem to be able
  648. > to generate very fast code for the PPC... I tried contacting tonyn@tiac.net
  649. > about his assembler, but he hasn't replied. I guess I could use PPCAsm,
  650. > since I have access to ETO disks, but I'm not very enthusiastic about
  651. > touching MPW.
  652.  
  653. I don't think that PPC assembly it totally taboo - just that there are
  654. strong warnings in place that it is a lot harder to improve over the
  655. compiler. There are lots of hard-core assembly programmers that swear up
  656. and down that assembly is the *only* way to go - C is for wusses. These
  657. people, for a large project, will probably not gain significantly (if at
  658. all) over the programmer that starts in C and optimizes little areas in
  659. assembly. They might have gotten away with it on an 040 or 486, but I
  660. think a PPC would break them. 
  661.  
  662. The other problem is that I believe the differences between the 601, 603,
  663. 604, 620, etc. are significant enough that all of those extra hours put
  664. into the assembly might be wasted once you run on the next chip - the
  665. compiler (assuming that it's been updated) should be smart enough to
  666. either 1) tailor your code easily to the chip or 2) avoid doing anything
  667. truly criminal to any one chip - sort of the lesser of all evils approach.
  668.  
  669. -- 
  670. Bob Cassidy
  671. UC Irvine
  672.  
  673. +++++++++++++++++++++++++++
  674.  
  675. >From allender@prairienet.org (Mark W. Allender)
  676. Date: 19 May 1995 13:16:01 GMT
  677. Organization: Prairienet, the East-Central Illinois Free-Net
  678.  
  679. Robert Cassidy (rmcassid@uci.edu) wrote:
  680.  
  681. : I don't think that PPC assembly it totally taboo - just that there are
  682. : strong warnings in place that it is a lot harder to improve over the
  683. : compiler. There are lots of hard-core assembly programmers that swear up
  684.  
  685. This argument over asm vs. C has been around for a long time.  Compilers
  686. for the PC generate really great code (watcom in particular).  But you know
  687. what, hand optimizing in asm in the most crucial spots can *always* be a
  688. win.  Why?  Because *you* know about the structure of your program, and how
  689. you can treat register allocation.  You may not always get a great speedup
  690. over the compiler, but in most cases, I believe that it is worth the effort
  691. (if you choose your battles carefully).
  692.  
  693. I have yet to see MWC generate the best code possible for my leaf routines
  694. -- and those are the ones that are getting called 10's of thousands of
  695. times per frame.
  696.  
  697. I have achieved a 20-30% speedup just by rewriting around 10 crucial
  698. routines in asm.  The point -- if you care about speed, then you should
  699. know how to optimize properly in asm!
  700.  
  701. --
  702. -Mark Allender
  703. -Parallax Software
  704. -allender@prairienet.org
  705.  
  706. +++++++++++++++++++++++++++
  707.  
  708. >From rmcassid@uci.edu (Robert Cassidy)
  709. Date: Fri, 19 May 1995 10:50:00 -0700
  710. Organization: UC Irvine
  711.  
  712. In article <3pi5mh$657@vixen.cso.uiuc.edu>, allender@prairienet.org (Mark
  713. W. Allender) wrote:
  714.  
  715. > You may not always get a great speedup
  716. > over the compiler, but in most cases, I believe that it is worth the effort
  717. > (if you choose your battles carefully).
  718.   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  719.  
  720. *That's* why the warning is there.
  721.  
  722. -- 
  723. Bob Cassidy
  724. UC Irvine
  725.  
  726. +++++++++++++++++++++++++++
  727.  
  728. >From Edmond Underwood <underwoe@booboo.Colorado.Edu>
  729. Date: 20 May 1995 00:31:13 GMT
  730. Organization: Rocky Mountain Internet Inc.
  731.  
  732. >The IBM/Motorola manuals (e.g. PowerPC 604 RISC Microprocessor User's
  733. >Manual) contain detailed examples of how the pipeline works. They also
  734. >have info on how to schedule your code (see for example section 6.6 in
  735. >the 604 User's manual). There is nothing obscure or tricky about it.
  736. >From what I can tell, it is mostly common sense once you see how the
  737. >pipelines work -- although I'm sure that experience helps. I also go
  738. >through the CW compiler output and also look in ROM to see what IBM
  739. >and Apple do. Would appreciate seeing more informative examples posted
  740. >here by the experts (e.g. last year Tim Olson at Apple Computer/Somerset
  741. >posted several interesting code examples).
  742.  
  743. >There are some differences between the 601 and 604 but they don't seem
  744. >to be a major matter. What I have done is concentrate on the 604 (there
  745. >are none of the old POWER ops to tempt one, e.g. when a 64 bit divide is
  746. >needed). And the manual is more readable. In fact the 604 (on paper) looks
  747. >like a really great chip -- with its 3 integer pipelines, etc.
  748. >
  749. >But at present don't have a 604 to program ! Am waiting patiently. Believe
  750. >that one facility it has, that the 601 doesn't, is a "nanosecond" timer
  751. >(used via the mftb op). Am I correct about this ? If so, this could help
  752. >with checking how well ones code is doing. Does anyone know about this ?
  753. >I found the manuals rather inconclusive.
  754.  
  755. >Nick Burgoyne           <sbrb@cats.ucsc.edu>            17 May 1995
  756.  
  757. Where can one find this book on 604 assembly?  What assembler do they
  758. recommend.  Just a standard CC on AIX or what?  Which brings me to my
  759. next question.  Who is shipping a 604, and what is it running?  NT won't
  760. be running on it until early to mid July.  What about AIX?  
  761.  
  762. -thanks
  763.  
  764. - -------------------------------------------------------------------------------
  765.  
  766. Edmond Underwood
  767. Systems Management Group
  768. Computing & Network Services (University of Colorado)
  769. E-mail:  underwoe@Colorado.Edu
  770.  
  771.  
  772.  
  773. +++++++++++++++++++++++++++
  774.  
  775. >From jmunkki@gamma.hut.fi (Juri Munkki)
  776. Date: 20 May 1995 11:07:10 GMT
  777. Organization: Helsinki University of Technology
  778.  
  779. In article <3pbqcp$74o@news.primenet.com> english@primenet.com (Lawson English) writes:
  780. >sandor (sbrb@cats.ucsc.edu) wrote:
  781. >
  782. >: > I don't understand what the taboo is on doing PPC assembly.  Assembly code
  783. >: > is assembly code in my book (aside from the obvious differences).
  784. >
  785. >: Agreed !  In fact PPC assembly was a lot easier to learn and use
  786. >: that 68K (let alone x86). It is a bit strange at first because of
  787. >: being a load store architecture. But once over that it goes smoothly. 
  788. >
  789. >
  790. >How are you at scheduling so that the pipelines remain full? What about 
  791. >604 vs 601 optimization?
  792.  
  793. I don't see any reason why PPC assemblers couldn't be made smart about
  794. this and allowed to optimize the code by reordering instructions whenever
  795. possible. It would also be neat to have an interactive tool that would
  796. show instruction timings and pipelines states as you edit the assembly
  797. source code.
  798.  
  799. -- 
  800. Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware lunch.
  801. http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  802.  
  803. +++++++++++++++++++++++++++
  804.  
  805. >From jmunkki@gamma.hut.fi (Juri Munkki)
  806. Date: 20 May 1995 11:10:35 GMT
  807. Organization: Helsinki University of Technology
  808.  
  809. In article <3pbsga$oq7@news.nd.edu> dmatiske@degas.helios.nd.edu (david matiskella) writes:
  810. >68040 code. It's not some new problem. Personally I would
  811. >optimize for the 601 since A) you can buy a system that uses
  812. >it, B) it's most likely going to be the slowest of the 3. 
  813.  
  814. My experience tells me that the 5200LC is the slowest PowerMac. It
  815. has a 75Mhz 603. The problem seems to be that it has a narrow data
  816. bus.
  817.  
  818. -- 
  819. Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware lunch.
  820. http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  821.  
  822. +++++++++++++++++++++++++++
  823.  
  824. >From allender@prairienet.org (Mark W. Allender)
  825. Date: 20 May 1995 13:02:32 GMT
  826. Organization: Prairienet, the East-Central Illinois Free-Net
  827.  
  828. Robert Cassidy (rmcassid@uci.edu) wrote:
  829. : > (if you choose your battles carefully).
  830. : *That's* why the warning is there.
  831.  
  832. That warning should be there for any optimization of asm.  Not just PPC.
  833.  
  834. --
  835. -Mark Allender
  836. -Parallax Software
  837. -allender@prairienet.org
  838.  
  839. +++++++++++++++++++++++++++
  840.  
  841. >From kbrown@vzzt.demon.co.uk (Kieran L. Brown)
  842. Date: 20 May 1995 16:16:14 +0100
  843. Organization: KGS
  844.  
  845. In message <3pkigu$hae@nukkekoti.cs.hut.fi> Juri Munkki wrote:
  846.  
  847. > In article <3pbqcp$74o@news.primenet.com> english@primenet.com (Lawson English) writes:
  848. > >sandor (sbrb@cats.ucsc.edu) wrote:
  849. > >
  850. > >: > I don't understand what the taboo is on doing PPC assembly.  Assembly code
  851. > >: > is assembly code in my book (aside from the obvious differences).
  852. > >
  853. > >: Agreed !  In fact PPC assembly was a lot easier to learn and use
  854. > >: that 68K (let alone x86).
  855.  
  856. Of course it is! It is RISC, after all!
  857.  
  858. If you really want a good processor, take a look at the new generation of ARM
  859. processors. They range from cheap and fast to less cheap and blindingly fast.
  860. They kick the PowerPC into a cocked hat!
  861.  
  862. -- 
  863. Kieran L. Brown
  864. KGS Solutions Limited
  865. ... 'Bother', said Pooh, glowing in the dark.
  866.  
  867. +++++++++++++++++++++++++++
  868.  
  869. >From jmunkki@gamma.hut.fi (Juri Munkki)
  870. Date: 20 May 1995 21:46:41 GMT
  871. Organization: Helsinki University of Technology
  872.  
  873. In article <rmcassid-1805951653330001@dante.eng.uci.edu> rmcassid@uci.edu (Robert Cassidy) writes:
  874. >I don't think that PPC assembly it totally taboo - just that there are
  875. >strong warnings in place that it is a lot harder to improve over the
  876. >compiler. There are lots of hard-core assembly programmers that swear up
  877. >and down that assembly is the *only* way to go - C is for wusses. These
  878. >people, for a large project, will probably not gain significantly (if at
  879. >all) over the programmer that starts in C and optimizes little areas in
  880. >assembly. They might have gotten away with it on an 040 or 486, but I
  881. >think a PPC would break them. 
  882.  
  883. This is exactly the reason why PPCAsm is a bad idea and inline assembly
  884. for MWC or Symantec C is a good idea. If you are forced to work with a
  885. separate assembly tool, you are more likely to write assembly code than
  886. you would if you started out with a C program.
  887.  
  888. I'm usually pretty good at detecting the critical parts of a program
  889. (those few % that execute all the time) and sometimes code these parts
  890. directly in assembly language, if the problem is easier to express in
  891. assembly language. My normal way of working is to prototype in C, then
  892. decide which way is easier (asm or C) and implement one.
  893.  
  894. I prefer the true inline approach to the asm function approach (Think C
  895. vs. MWC) because the truely inlined approach allows you to set up
  896. variables with C and then use asm only for the critical part of that
  897. function whereas in an asm function you either have to set up everything
  898. with asm or you have to define a calling C function that does the
  899. setting up.
  900.  
  901.  
  902. Everyone knows that underlined text is bad and should never be used for
  903. anything and that it was only invented because typewriters couldn't
  904. easily type italic or boldface. Yet word processsors all allow you to
  905. use underlined text. I wish compiler writers would listen to the users
  906. and allow inline assembly even though they know that is not officially
  907. a good idea to use assembly language.
  908.  
  909. -- 
  910. Juri Munkki jmunkki@hut.fi      There ain't no such thing as a shareware lunch.
  911. http://www.hut.fi/~jmunkki              Windsurfing: Faster than the wind.
  912.  
  913. +++++++++++++++++++++++++++
  914.  
  915. >From maynard@elwing.otago.ac.nz (Maynard James Handley)
  916. Date: 21 May 1995 09:17:20 GMT
  917. Organization: University of Otago, Dunedin, NZ
  918.  
  919.  
  920. > : : : off.  And there's the MPW assembler from Apple--ick.  
  921.  
  922. > : : Ick indeed.
  923.  
  924. > : Not to sound naive (it is possible), but what is wrong with that assembler?
  925. > : It works fine for me.
  926.  
  927. > Indeed it does. HOwever, it is really difficult to learn to use, IMHO, 
  928. > and 1) requires that you have MPW and 2) that you know how to use MPW.
  929.  
  930. > The documentation is "spotty" shall we say?
  931.  
  932. It is certainly true that the PPCAsm documentation sucks. I have no idea
  933. how anyone is supposed to produce their first code without an example to 
  934. guide them.
  935. However it is NOT true that PPAsm requires MPW. SC++ 8 (and anything else 
  936. that uses Toolserver) can make use of PPCAsm. 
  937. I hav patched together an AppleScript plus a Toolserver script that 
  938. compiles my C/C++ in the Symantec environment, and the assembly and linking
  939. under Toolserver. Works like a charm.
  940. (And might I say, shows just how cool AppleScript is. The scripts were 
  941. put together using recording, and do all sortsa extra stuff like 
  942. shuffle files around and auto launch apps.)
  943.  
  944. I'd recommend anyone interested in PPC assembly and with the SC++8 CD to 
  945. look at PPCAsm and Toolserver.
  946.  
  947. I'm afraid I don't know about MW. Can they use Toolserver and produce 
  948. xcoff objects so they can be linked by PPCLink?
  949.  
  950. Maynard Handley
  951.  
  952. +++++++++++++++++++++++++++
  953.  
  954. >From maynard@elwing.otago.ac.nz (Maynard James Handley)
  955. Date: 21 May 1995 09:34:18 GMT
  956. Organization: University of Otago, Dunedin, NZ
  957.  
  958. Hi,
  959. Enough about whether or not to code in PPC assembly. 
  960. a) It's not amazingly hard---common sense and understanding how the chip 
  961. works will tell you most all you need to know about keeping the pipelines 
  962. busy.
  963. b) Have the people on the side of the compilers actually LOOKED at 
  964. compiler output? I've only looked at SC and MW, not xlc and the new Motorola
  965. compilers which may be much better. But SC and MW are way suboptimal.
  966. Common reasons for this are
  967.   * Compiling is tough. The code goes through a bunch of abstractions 
  968.   and data is lost on the way to the code generator. You in assembly know 
  969.   that lost info.
  970.   * Sometimes in C you can't specify what you want done exactly---like 
  971.   load in a value from somewhere as a double then do a bunch of single 
  972.   precision ops on it, then write it as a double. The compiler will 
  973.   insert various steps along the way that do roundings and such you 
  974.   probably don't need. The same thing if you do a lot of work mixing
  975.   signed and unsigned values.
  976.   * There are some very cools PPC features you simply accnot access from 
  977.   C. Examples are 
  978.     # Clearing an array to zero by using the cache block clearing operations.
  979.     # Touching cache data a few operations before you need it so as 
  980.     to preload it.
  981.     # Those funky shift and exatract with mask operations for bit-field 
  982.     extraction.
  983.   * There are common-sense optimizations for speeding up code like 
  984.   software-pipelining to interleave loads/stores for the next/previous 
  985.   set of data while doing arithmetic on the current set. The compilers should 
  986.   be capable of this sort of thing, like loop-unrolling, but doesn't seem
  987.   to be.
  988.  
  989. Having said that, a change of pace and a real question, not faffing around.
  990.  
  991. I am trying to get to grips with the nitty-gritty of PPC 601 timings and 
  992. have come across something that does not make sense to me. I'd appreciate
  993. any comments people have. 
  994. Essentiallu what I am trying to figure out is why a floating 
  995. point store, fpsb, seems to block a subsequent integer store by two clocks.
  996. Consider the code 
  997.  
  998.         stfd fp0, 0(r3)
  999.         lwz  r4, 0(r5)
  1000.         addi r0, r0, 0
  1001.         addi r0, r0, 0
  1002.         addi r0, r0, 0
  1003.                                                 (Example 1)
  1004.         addi r0, r0, 0
  1005.         addi r0, r0, 0
  1006.         addi r0, r0, 0
  1007.         addi r0, r0, 0
  1008.  
  1009.  blr 
  1010.  END                    
  1011.  
  1012. This executes in exactly the time one would expect, one clock per 
  1013. instruction with the blr basically free. The long string of addis
  1014. before the blr is to make sure we have CARB/CACC free enough 
  1015. in advance for the blr. This simplifies the problem so we don't have 
  1016. to deal with two issues at once.
  1017. (If you don't appreciate the point of that, you're probably not going to be 
  1018. able to answer the question.)
  1019. In the same vein, everything is set up not to cross double-word boundaries.
  1020.  
  1021. Now suppose we change this code to 
  1022.  
  1023.         stfd fp0, 0(r3)
  1024.         stw  r4, 0(r5)
  1025.         addi r0, r0, 0
  1026.         addi r0, r0, 0
  1027.         addi r0, r0, 0
  1028.                                                 (Example 2)
  1029.         addi r0, r0, 0
  1030.         addi r0, r0, 0
  1031.         addi r0, r0, 0
  1032.         addi r0, r0, 0
  1033.  
  1034.  blr 
  1035.  END                    
  1036.  
  1037. Now the code will take two cycles longe. But the two extra cycles are stalls
  1038. behind the stfd. We can see this if we change the code to 
  1039.  
  1040.         stfd fp0, 0(r3)
  1041.         addi r0, r0, 0
  1042.         addi r0, r0, 0
  1043.         stw  r4, 0(r5)
  1044.         addi r0, r0, 0
  1045.                                                 (Example 3)
  1046.         addi r0, r0, 0
  1047.         addi r0, r0, 0
  1048.         addi r0, r0, 0
  1049.         addi r0, r0, 0
  1050.  
  1051.  blr 
  1052.  END                    
  1053. This code executes in the same amount of time as the first snippet of code.
  1054.  
  1055. Now reading the 601 manual, chapter 7 closely, it's not at all clear why
  1056. this should happen. What do we know?
  1057. The fp store will pass through ID, IE and IC all in one cycle. This 
  1058. is confirmed by the fact that in example (1) there are no stalls. 
  1059. the fp store WILL block for three clocks in FPSB while the data is hauled
  1060. through the fp pipeline but that should not affect anyone. Additionally
  1061. it is only after these three clocks that CARB and CACC are needed, 
  1062. while (in example 2) the integer store would need them earlier thus there 
  1063. would be no structural hazard regarding those. Claerly from the code there is 
  1064. no data hazard.
  1065.  
  1066. My hypothesis is that while the 601 manual seems to imply FPSB and ISB (pg 7-36) 
  1067. are independent, they are in fact not independent. Thus with FPSB occupied
  1068. there is a structural hazard that prevents ISB from being available for use.
  1069. Until FPSB is freed, any instruction that wants to access ISB is frozen.
  1070.  
  1071. Is this in fact correct, or is there a better explanation for this fact?
  1072.  
  1073. I came across this while playing around trying to write opmtimal code
  1074. for setting a long array to the same (non-zero) value. This is an extremely
  1075. interesting problem. One would like to use stfd and write 8 bytes at a time
  1076. but that is not the full answer because stfd sits in FPSB for three clocks.
  1077. A long sequence of stw's is not a great idea because more than four in a 
  1078. row and you starve the instruction queue (really makes you wish 601 had 
  1079. Harvard caches). My solution uses an insane mix of stfd's interleaved with
  1080. stswi's with gaps between these to do various weird stuff. It looks
  1081. absurd but is wicked-fast. 
  1082.  
  1083. Has anyone made code available that is known to be optimal for this sort of 
  1084. problem? If not, might I suggest that we formalize it as a contest? Writing
  1085. this sort of code is wonderful fun and even though one reaches a point 
  1086. where saving one cycle in 200 doesn't make sense as an engineering issue,
  1087. as a contest no work is too much to achieve optimal results.
  1088. If enough people agree this might be fun, I can formalize the problem 
  1089. and post it.
  1090.  
  1091. (Finally please no-one give me the lecture on stswi being bad for machines 
  1092. other than 601. I know, I know. This stuff is all shared-library based. I'll
  1093. just rewrite the code and use a new lib for 603 and 604.)
  1094.  
  1095. Maynard Handley
  1096.  
  1097.  
  1098. +++++++++++++++++++++++++++
  1099.  
  1100. >From english@primenet.com (Lawson English)
  1101. Date: 21 May 1995 21:04:42 GMT
  1102. Organization: Primenet Services for the Internet (602)395-1010
  1103.  
  1104. Maynard James Handley (maynard@elwing.otago.ac.nz) wrote:
  1105. [snipt]
  1106. : Having said that, a change of pace and a real question, not faffing around.
  1107.  
  1108. : I am trying to get to grips with the nitty-gritty of PPC 601 timings and 
  1109. : have come across something that does not make sense to me. I'd appreciate
  1110. : any comments people have. 
  1111. : Essentiallu what I am trying to figure out is why a floating 
  1112. : point store, fpsb, seems to block a subsequent integer store by two clocks.
  1113. : Consider the code 
  1114.  
  1115. You missed it. From page i-175 of the Motorola PowerPC 601 User's Manual:
  1116.  
  1117. "For a series of fp store instructions, the maximum throughput is one fp 
  1118. store every three processor cycles. Each store holds in FWA for 2 cycles 
  1119. and this freezes the entire PFU pipeline. THerefore, one cannot schedule 
  1120. fp instructions in between the float stores to improve throughput in the 
  1121. fp unit. Becuase the float stores also take ua a position in the integer 
  1122. pipeline, there is no opportunity to schedule in integer instructions and 
  1123. improve throughput in the interger pipeline."
  1124.  
  1125. It goes on to say that FP load/store operations are inherently slower 
  1126. than FP load/stores, if youare doing a block-move/copybits style function.
  1127.  
  1128.  
  1129. The only exception to this, BTW, is if you are writing to non-cacheable 
  1130. memory, like the VRAM, where the latency of the memory is such that you 
  1131. have more delay from accessing memory than from freezing the pipelines 
  1132. for a few cycles.
  1133.  
  1134. The 604 may be different in this respect (faster at fp stores, I believe).
  1135.  
  1136. --
  1137. - -----------------------------------------------------------------------------
  1138. Lawson English                            __  __     ____  ___       ___ ____
  1139. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  1140.                                         /   / \  / / / / /__ /  \/ /___  /
  1141. - -----------------------------------------------------------------------------
  1142.  
  1143. +++++++++++++++++++++++++++
  1144.  
  1145. >From sandvik@apple.com (Kent Sandvik)
  1146. Date: Sun, 21 May 1995 14:49:45 -0800
  1147. Organization: Apple Computer, Inc. Developer Technical Support
  1148.  
  1149. In article <3pi5mh$657@vixen.cso.uiuc.edu>, allender@prairienet.org (Mark
  1150. W. Allender) wrote:
  1151. > This argument over asm vs. C has been around for a long time.  Compilers
  1152. > for the PC generate really great code (watcom in particular).  But you know
  1153. > what, hand optimizing in asm in the most crucial spots can *always* be a
  1154. > win.  Why?  Because *you* know about the structure of your program, and how
  1155. > you can treat register allocation.  You may not always get a great speedup
  1156. > over the compiler, but in most cases, I believe that it is worth the effort
  1157. > (if you choose your battles carefully).
  1158.  
  1159. True. There are exceptions though, such as pipeline optimization (a must
  1160. with most RISC architectures) that a smart linker could do, a smart person
  1161. could also learn this after a couple of months/years, but for the average
  1162. code cruncher it's better to stick to tools.
  1163.  
  1164. --Kent
  1165.  
  1166. -- 
  1167. Kent Sandvik   sandvik@apple.com                  Working with Multimedia stuff...
  1168. Apple Developer Technical Support.                 Private activities on Internet.
  1169.  
  1170. +++++++++++++++++++++++++++
  1171.  
  1172. >From Mark Williams <Mark@streetly.demon.co.uk>
  1173. Date: 22 May 1995 07:47:49 +0100
  1174. Organization: Streetly Software
  1175.  
  1176.  
  1177. In article <3pfr30$bbe@waage.rz.uni-ulm.de>, Heiner Wolf writes:
  1178.  
  1179. > > I know that you'd have to be an idiot to write lots of PPC assembly
  1180. > > (other than for code generators) and I know that Apple recommends against
  1181. > > it, but still:  Is anyone out there writing significant portions of an
  1182. > > app or game or whatever in PowerPC assembly?  I'd love to hear what you
  1183. > > have to say.
  1184. > We are coding the kernal of a JPEG image decompressor in assembler.
  1185. > Yes, I know. The compilers are so good and it is not neccessary. But if I can
  1186.  
  1187. Falls down laughing. Just which compilers would those be...?
  1188.  
  1189. Mark Williams
  1190.  
  1191. +++++++++++++++++++++++++++
  1192.  
  1193. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1194. Date: Mon, 22 May 1995 17:35:45 +1200 (NZDT)
  1195. Organization: (none)
  1196.  
  1197. maynard@elwing.otago.ac.nz (Maynard James Handley) writes:
  1198. > I am trying to get to grips with the nitty-gritty of PPC 601 timings and 
  1199. > have come across something that does not make sense to me. I'd appreciate
  1200. > any comments people have. 
  1201. > Essentiallu what I am trying to figure out is why a floating 
  1202. > point store, fpsb, seems to block a subsequent integer store by two clocks.
  1203.  
  1204. The 601 manual talks about this on page I-175.  Each FP store holds in FWA
  1205. for two cycles, blocking both the FP and integer pipes.  Bummer.  This
  1206. makes it faster to move operations using integer loads and stores.  (if
  1207. the memory is cachable)
  1208.  
  1209. -- Bruce
  1210.  
  1211. +++++++++++++++++++++++++++
  1212.  
  1213. >From tim@ibmoto.com (Tim Olson)
  1214. Date: 20 May 1995 09:50:23 -0500
  1215. Organization: Apple/IBM/Motorola Somerset Design Center, Austin, TX
  1216.  
  1217. In article <3pbsga$oq7@news.nd.edu>,
  1218. david matiskella <dmatiske@degas.helios.nd.edu> wrote:
  1219. >I assume he doing it by hand.  For 601/603/604 optimization you
  1220. >have to either pick one or pick the code which gives acceptable
  1221. >performance on all three. Nothing new. Optimum pentium code isn't
  1222. >optimum 486 code. Similiar Optium 68K is not the same as otptium
  1223. >68040 code. It's not some new problem. Personally I would
  1224. >optimize for the 601 since A) you can buy a system that uses
  1225. >it, B) it's most likely going to be the slowest of the 3. 
  1226.  
  1227. Actually, it is better to schedule code with the most parallel
  1228. microarchitecture in mind.  Since the 601 has a single, combined
  1229. integer/load/store unit, it really doesn't matter what order instructions
  1230. are fed through it, as long as the code is scheduled around true
  1231. dependencies (mainly loads to load-uses).
  1232.  
  1233. However, a 604 can benefit from having parallelism exposed.
  1234.  
  1235.  
  1236. -- 
  1237.         Tim Olson
  1238.         Apple Computer / Somerset
  1239.         (tim@apple.com)
  1240.  
  1241. +++++++++++++++++++++++++++
  1242.  
  1243. >From tim@ibmoto.com (Tim Olson)
  1244. Date: 20 May 1995 09:57:29 -0500
  1245. Organization: Apple/IBM/Motorola Somerset Design Center, Austin, TX
  1246.  
  1247. In article <sbrb-1705950803270001@sandor23.slip.crl.com>,
  1248. sandor <sbrb@cats.ucsc.edu> wrote:
  1249. >But at present don't have a 604 to program ! Am waiting patiently. Believe 
  1250. >that one facility it has, that the 601 doesn't, is a "nanosecond" timer 
  1251. >(used via the mftb op). Am I correct about this ? If so, this could help 
  1252. >with checking how well ones code is doing. Does anyone know about this ?
  1253. >I found the manuals rather inconclusive.
  1254.  
  1255. Yes, the PowerPC architecture has a 64-bit Timebase register which is
  1256. accessible in user-mode code.  What this register counts is implementation-
  1257. defined, but on all existing PowerPC processors (except 601, which does
  1258. not have the Timebase register, but instead has the RTC) the Timebase
  1259. counts multiples of bus clocks (i.e. the timebase increments every 4 bus
  1260. clocks).
  1261.  
  1262. The MFTB instruction returns the lower 32 bits of the timebase, while the
  1263. MFTBU instruction returns the upper.  It is left as an excercise to the
  1264. reader to come up with a short instruction sequence that returns a
  1265. "coherent" 64-bit pair, as the split read is not atomic...
  1266.  
  1267. -- 
  1268.         Tim Olson
  1269.         Apple Computer / Somerset
  1270.         (tim@apple.com)
  1271.  
  1272. +++++++++++++++++++++++++++
  1273.  
  1274. >From andrewed@ee.latrobe.edu.au (Andrew Edgecombe)
  1275. Date: 19 May 1995 14:38:29 +1000
  1276. Organization: Department of Electronic Engineering, La Trobe University
  1277.  
  1278. Power mac forth? Where, when , who etc.
  1279. Someone please let me know about it!!!
  1280.  
  1281. andrewed@ee.latrobe.edu.au
  1282.  
  1283.  
  1284. +++++++++++++++++++++++++++
  1285.  
  1286. >From dom@i-cubed.demon.co.uk (Dom)
  1287. Date: Mon, 22 May 1995 12:28:50
  1288. Organization: i-cubed ltd., Cambridge, UK
  1289.  
  1290. In article <rmcassid-1805951653330001@dante.eng.uci.edu> rmcassid@uci.edu (Robert Cassidy) writes:
  1291.  
  1292. >> >I don't understand what the taboo is on doing PPC assembly.  Assembly code
  1293. >> >is assembly code in my book (aside from the obvious differences).
  1294.  
  1295.  
  1296. >> I agree quite totally. If a person wants to use assembly language, then
  1297. >> he/she should be allowed to use it. At least MWC doesn't seem to be able
  1298. >> to generate very fast code for the PPC... I tried contacting tonyn@tiac.net
  1299. >> about his assembler, but he hasn't replied. I guess I could use PPCAsm,
  1300. >> since I have access to ETO disks, but I'm not very enthusiastic about
  1301. >> touching MPW.
  1302.  
  1303. >I don't think that PPC assembly it totally taboo - just that there are
  1304. >strong warnings in place that it is a lot harder to improve over the
  1305. >compiler. There are lots of hard-core assembly programmers that swear up
  1306. >and down that assembly is the *only* way to go - C is for wusses. These
  1307.  
  1308. These people also get up at six, have a cold shower, run barefoot for three
  1309. miles, before mowing the lawn with a pair of scissors.  And that's a Sunday
  1310. morning lie-in :)
  1311.  
  1312. Anyway, I'm doing some 403GA test code, and I have to use assembler. 
  1313. Doesn't take too long to get your head around it, after which,
  1314. it's much like anything else.
  1315.  
  1316. --
  1317.  Dom - the look and feel of this sig is mine mine mine
  1318.  
  1319.  
  1320. +++++++++++++++++++++++++++
  1321.  
  1322. >From ubpliner@mcs.drexel.edu (Bradley S. Pliner)
  1323. Date: Tue, 23 May 1995 00:12:58 -0400
  1324. Organization: Drexel University
  1325.  
  1326. I strongly recommend staying away from RISC-based assembly programming,
  1327. unless it's 100% necessary, and you've eaten your weeties. You have a lot
  1328. to worry about that is not an issue with CISC-based assembly. Foremost,
  1329. pipelined instructions will be a real pain in the butt to work with.
  1330.  
  1331. In article <dom.442.000C7B6A@i-cubed.demon.co.uk>, dom@i-cubed.demon.co.uk
  1332. (Dom) wrote:
  1333.  
  1334. > In article <rmcassid-1805951653330001@dante.eng.uci.edu>
  1335. rmcassid@uci.edu (Robert Cassidy) writes:
  1336. > >> >I don't understand what the taboo is on doing PPC assembly.  Assembly code
  1337. > >> >is assembly code in my book (aside from the obvious differences).
  1338. >  
  1339. > >> I agree quite totally. If a person wants to use assembly language, then
  1340. > >> he/she should be allowed to use it. At least MWC doesn't seem to be able
  1341. > >> to generate very fast code for the PPC... I tried contacting tonyn@tiac.net
  1342. > >> about his assembler, but he hasn't replied. I guess I could use PPCAsm,
  1343. > >> since I have access to ETO disks, but I'm not very enthusiastic about
  1344. > >> touching MPW.
  1345. > >I don't think that PPC assembly it totally taboo - just that there are
  1346. > >strong warnings in place that it is a lot harder to improve over the
  1347. > >compiler. There are lots of hard-core assembly programmers that swear up
  1348. > >and down that assembly is the *only* way to go - C is for wusses. These
  1349. > These people also get up at six, have a cold shower, run barefoot for three
  1350. > miles, before mowing the lawn with a pair of scissors.  And that's a Sunday
  1351. > morning lie-in :)
  1352. > Anyway, I'm doing some 403GA test code, and I have to use assembler. 
  1353. > Doesn't take too long to get your head around it, after which,
  1354. > it's much like anything else.
  1355. > --
  1356. >  Dom - the look and feel of this sig is mine mine mine
  1357.  
  1358. -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
  1359. Bradley S. Pliner,  ubpliner@mcs.drexel.edu,  (215) 355-6419 (Call 24 hr/day)
  1360. Drexel University: Comp Sci BS (Sept '95), Software Engineering MS (June '96)
  1361. -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
  1362.  
  1363. +++++++++++++++++++++++++++
  1364.  
  1365. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1366. Date: Wed, 24 May 1995 13:59:21 +1200 (NZDT)
  1367. Organization: (none)
  1368.  
  1369. ubpliner@mcs.drexel.edu (Bradley S. Pliner) writes:
  1370. > I strongly recommend staying away from RISC-based assembly programming,
  1371. > unless it's 100% necessary, and you've eaten your weeties. You have a lot
  1372. > to worry about that is not an issue with CISC-based assembly. Foremost,
  1373. > pipelined instructions will be a real pain in the butt to work with.
  1374.  
  1375. This seems like really strange advice.  The Pentium and 68040 are also
  1376. pipelined processors, and they are far more complex to understand and
  1377. optomise for than the PowerPC -- so much so that most compilers and
  1378. indeed assembly programmers don't even try, but just guess what will
  1379. work OK.
  1380.  
  1381. -- Bruce
  1382.  
  1383. +++++++++++++++++++++++++++
  1384.  
  1385. >From maynard@elwing.otago.ac.nz (Maynard James Handley)
  1386. Date: 24 May 1995 07:47:22 GMT
  1387. Organization: University of Otago, Dunedin, NZ
  1388.  
  1389. Bruce Hoult (Bruce@hoult.actrix.gen.nz) wrote:
  1390. > maynard@elwing.otago.ac.nz (Maynard James Handley) writes:
  1391. > > I am trying to get to grips with the nitty-gritty of PPC 601 timings and 
  1392. > > have come across something that does not make sense to me. I'd appreciate
  1393. > > any comments people have. 
  1394. > > Essentiallu what I am trying to figure out is why a floating 
  1395. > > point store, fpsb, seems to block a subsequent integer store by two clocks.
  1396.  
  1397. > The 601 manual talks about this on page I-175.  Each FP store holds in FWA
  1398. > for two cycles, blocking both the FP and integer pipes.  Bummer.  This
  1399. > makes it faster to move operations using integer loads and stores.  (if
  1400. > the memory is cachable)
  1401.  
  1402. > -- Bruce
  1403.  
  1404. You have misinterpreted what page I-175 means.
  1405. You cannot have BACK-TO-BACK fp stores. The 2nd fp store will stall 
  1406. because the FPSB is in use, and because an fp store goes through the 
  1407. integer pipeline the integer pipeline freezes. 
  1408. This DOES NOT mean the integer pipeline freezes for three clocks
  1409. whenever you use an fp store. For example if you slot loads 
  1410. or additions or such like afer the fp store they will go just fine with 
  1411. no delays---try it. it is only if you slot a second fp store (or as i 
  1412. explained in my original post, an integer store) that you block.
  1413.  
  1414. Using fpstore/fpload as a bit-blt is not always a bad idea. If you 
  1415. canfit in only the slightest extra work between the stores you come 
  1416. out ahead. 
  1417.  
  1418. Maynard
  1419.  
  1420.  
  1421. +++++++++++++++++++++++++++
  1422.  
  1423. >From allender@prairienet.org (Mark W. Allender)
  1424. Date: 24 May 1995 16:01:55 GMT
  1425. Organization: Prairienet, the East-Central Illinois Free-Net
  1426.  
  1427. Bruce Hoult (Bruce@hoult.actrix.gen.nz) wrote:
  1428. : ubpliner@mcs.drexel.edu (Bradley S. Pliner) writes:
  1429. : > I strongly recommend staying away from RISC-based assembly programming,
  1430. : > unless it's 100% necessary, and you've eaten your weeties. You have a lot
  1431.  
  1432. : This seems like really strange advice.  The Pentium and 68040 are also
  1433. : pipelined processors, and they are far more complex to understand and
  1434.  
  1435. BINGO!!!
  1436.  
  1437. --
  1438. -Mark Allender
  1439. -Parallax Software
  1440. -allender@prairienet.org
  1441.  
  1442. +++++++++++++++++++++++++++
  1443.  
  1444. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1445. Date: Thu, 25 May 1995 15:39:22 +1200 (NZDT)
  1446. Organization: (none)
  1447.  
  1448. maynard@elwing.otago.ac.nz (Maynard James Handley) writes:
  1449. > You have misinterpreted what page I-175 means.
  1450. > You cannot have BACK-TO-BACK fp stores. The 2nd fp store will stall 
  1451. > because the FPSB is in use, and because an fp store goes through the 
  1452. > integer pipeline the integer pipeline freezes.
  1453. >
  1454. > This DOES NOT mean the integer pipeline freezes for three clocks
  1455. > whenever you use an fp store. For example if you slot loads 
  1456. > or additions or such like afer the fp store they will go just fine with 
  1457. > no delays---try it. it is only if you slot a second fp store (or as i 
  1458. > explained in my original post, an integer store) that you block.
  1459.  
  1460. So you're saying that a single FP store doesn't freeze the integer pipe
  1461. at all -- it's the second FP store that causes the integer line to stall
  1462. in sympathy with the FP line?
  1463.  
  1464. A small point about "slot loads or additions or such like afer the fp
  1465. store": have you allowed for the FP store (or any FP instruction)
  1466. being dispatched from high in the instruction queue, while the integer
  1467. instructions dispatch only from the bottom slot?
  1468.  
  1469. -- Bruce
  1470.  
  1471. ---------------------------
  1472.  
  1473. >From timmyd@netcom.com (Tim DeBenedictis)
  1474. Subject: Can one do custom controls w-o CDEFs?
  1475. Date: Tue, 23 May 1995 00:42:17 GMT
  1476. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1477.  
  1478. I was wondering: is it possible to develop a custom control WIHOUT using 
  1479. a CDEF?
  1480.  
  1481. Here's my thoughts on how you'd do it:
  1482.  
  1483. 1) Write your own control definition procedure.
  1484. 2) Create a new control via a standard NewControl() call.
  1485. 3) Replace the pointer to the control definition procedure inside the 
  1486. control record returned in step 2) with a pointer to my own definition 
  1487. procedure (step 1) or an equivalent UPP (on the PowerPC).
  1488.  
  1489. I haven't tried this at all, yet, but I'm wondering if this is a 
  1490. hopelessly flawed approach to begin with.
  1491.  
  1492. Is there any recommended way of doing a picture-button? (By this, I mean 
  1493. a simple push-button which displays a picture instead of text, and 
  1494. displays a different picture when pressed.)  I want to have the 
  1495. capability of doing something like a toolbar.  (Is there any reccomended 
  1496. way of doing a toolbar, for that matter?  I hate the things, but it seems 
  1497. to me that there is no real way around them.)
  1498.  
  1499. I'd also like to make a control which contains a TERec, and does what a 
  1500. TERec would do when clicked, etc.  Is there any quick-n-dirty way to do 
  1501. this?  Is sample code available anywhere?
  1502.  
  1503. Thanks in advance,
  1504.  
  1505. -Tim DeBenedictis
  1506.  
  1507.  
  1508. +++++++++++++++++++++++++++
  1509.  
  1510. >From graham@impro.demon.co.uk (Graham)
  1511. Date: 23 May 1995 12:02:29 +0100
  1512. Organization: Demon Internet
  1513.  
  1514. Yes you can. The technique you suggest is ALMOST correct. However, the
  1515. defproc "pointer" needs to be a handle, so you need to create a handle
  1516. to a routine descriptor, and put that handle in the defproc field. The
  1517. code can be embedded in your app code, and of course can be easily
  1518. debugged there. I use this technique extensively- MDEF's, CDEFs, LDEFs
  1519. all work. If you are not using UPPs, then you need to create a dummy
  1520. jump instruction in the handle which jumps to your code. If you need
  1521. the code, eMail me.
  1522.  
  1523. regards, Graham.
  1524.  
  1525. PS. I don't knoe of a "standard" method for picture buttons, but the
  1526. CDEf can do naything it needs to, like load pictures, etc. So most
  1527. techniques work.
  1528.  
  1529. +++++++++++++++++++++++++++
  1530.  
  1531. >From uminger@mcs.drexel.edu (Lord of the Sith)
  1532. Date: Tue, 23 May 95 18:04:57 GMT
  1533. Organization: Drexel University, Dept. of Math. and Comp. Sci.
  1534.  
  1535. Tim DeBenedictis (timmyd@netcom.com) wrote:
  1536.  
  1537. : I'd also like to make a control which contains a TERec, and does what a 
  1538. : TERec would do when clicked, etc.  Is there any quick-n-dirty way to do 
  1539. : this?  Is sample code available anywhere?
  1540.  
  1541. Well,  TextEdit, despite the claims made in inside macintosh is anything but
  1542. easy.  But, it's by far the easiest way on the mac.  There is no quick and
  1543. dirty way.  
  1544.  
  1545. For source code, follow this url and look around:
  1546.  
  1547. http://www.info.apple.com/dev/developerservices.html
  1548.  
  1549. somewhere, theres a file with the words TESample in it.  That's it.
  1550. If you follow the links developer stuff, and then source code, yuou'll
  1551. find it.
  1552.  
  1553. : Thanks in advance,
  1554.  
  1555. : -Tim DeBenedictis
  1556.  
  1557.  
  1558. --
  1559. Matt Inger
  1560. uminger@mcs.drexel.edu
  1561. http://mcs.drexel.edu/~uminger/
  1562. "Remember when you were young?  You shone like the sun."
  1563.  
  1564. +++++++++++++++++++++++++++
  1565.  
  1566. >From jordanz@altura.com (Jordan Zimmerman)
  1567. Date: Wed, 24 May 1995 11:19:32 -0800
  1568. Organization: Altura Software, Inc.
  1569.  
  1570. > 1) Write your own control definition procedure.
  1571. > 2) Create a new control via a standard NewControl() call.
  1572. > 3) Replace the pointer to the control definition procedure inside the 
  1573. > control record returned in step 2) with a pointer to my own definition 
  1574. > procedure (step 1) or an equivalent UPP (on the PowerPC).
  1575.  
  1576. There isn't a "pointer" to a CDEF in the control_h.  It's a Handle to a
  1577. CDEF resource.  This creates a major problem for what you want to do.  The
  1578. only real way to do this is to use the "6 Byte CDEF trick".  You create a
  1579. CDEF that is 6 bytes long and contains the following data "0x4EF9 0000
  1580. 0000".  At runtime, you fill the zeroes with a pointer to your CDEF in
  1581. your app (make sure to flush the caches).
  1582.  
  1583. However, this is all just a big kludge.  Is there such a great benefit to
  1584. using the Control Manager at all?  The code to track a mouse click fits
  1585. into a small function and the CDEF does the rest anyways.  Why not skip
  1586. the Control Manager altogether.
  1587.  
  1588. -- 
  1589. Jordan Zimmerman, Altura Software
  1590. home page: http://www.altura.com/jordanz/home.html
  1591. Who is John Galt?
  1592.  
  1593. ---------------------------
  1594.  
  1595. >From Stuart A. Malone <samalone@mit.edu>
  1596. Subject: Extracting data from AEDescs
  1597. Date: 24 May 1995 14:13:05 GMT
  1598. Organization: Massachusetts Institute of Technology
  1599.  
  1600. What is the best way of extracting primitive data (like a DescType) from
  1601. an AEDesc?  Several of the other types in OSA have routines that will
  1602. extract some portion of the data to a pointer in a particular format:
  1603.  
  1604.     AppleEvent:      AEGetParamPtr
  1605.     AERecord:        AEGetKeyPtr
  1606.     AEDescList:      AEGetNthPtr
  1607.  
  1608. However, there does not seem to be any corresponding routine when using a
  1609. raw AEDesc.  This comes up, for example, when writing object accessor
  1610. functions, where the keyForm argument is passed in as an AEDesc.
  1611.  
  1612. The best I've been able to come up with is:
  1613.  
  1614.     DescType ExtractDescType(const AEDesc * originalDesc)
  1615.     {
  1616.         AEDesc    tempDesc;
  1617.         DescType  result;
  1618.  
  1619.         OSErr err = AECoerceDesc(originalDesc, typeType, &tempDesc);
  1620.         if (err != noErr) throw err;
  1621.  
  1622.         result = **((DescType **)tempDesc.dataHandle);
  1623.         AEDisposeDesc(&tempDesc);
  1624.  
  1625.         return result;
  1626.     }
  1627.  
  1628. But it bothers me that I have to extract the data using brute-force
  1629. coercion, especially since Apple was saying at WWDC '95 that Copland is
  1630. going to move to a pointer-based implementation of AppleScript.  Does
  1631. anybody have a better way to accomplish this?
  1632.  
  1633. --Stuart A. Malone
  1634. MIT Lab for Advanced Technology in the Humanities
  1635.  
  1636. +++++++++++++++++++++++++++
  1637.  
  1638. >From BrianS@pbcomputing.com (Brian Stern)
  1639. Date: Wed, 24 May 1995 11:31:43 -0500
  1640. Organization: The University of Texas at Austin, Austin, Texas
  1641.  
  1642. In article <3pveti$hmu@senator-bedfellow.MIT.EDU>, Stuart A. Malone
  1643. <samalone@mit.edu> wrote:
  1644.  
  1645. < What is the best way of extracting primitive data (like a DescType) from
  1646. < an AEDesc?  Several of the other types in OSA have routines that will
  1647. < extract some portion of the data to a pointer in a particular format:
  1648. <     AppleEvent:      AEGetParamPtr
  1649. <     AERecord:        AEGetKeyPtr
  1650. <     AEDescList:      AEGetNthPtr
  1651. < However, there does not seem to be any corresponding routine when using a
  1652. < raw AEDesc.  This comes up, for example, when writing object accessor
  1653. < functions, where the keyForm argument is passed in as an AEDesc.
  1654. < The best I've been able to come up with is:
  1655. <     DescType ExtractDescType(const AEDesc * originalDesc)
  1656. <     {
  1657. <         AEDesc    tempDesc;
  1658. <         DescType  result;
  1659. <         OSErr err = AECoerceDesc(originalDesc, typeType, &tempDesc);
  1660. <         if (err != noErr) throw err;
  1661. <         result = **((DescType **)tempDesc.dataHandle);
  1662. <         AEDisposeDesc(&tempDesc);
  1663. <         return result;
  1664. <     }
  1665. < But it bothers me that I have to extract the data using brute-force
  1666. < coercion, especially since Apple was saying at WWDC '95 that Copland is
  1667. < going to move to a pointer-based implementation of AppleScript.  Does
  1668. < anybody have a better way to accomplish this?
  1669.  
  1670. Maybe I'm missing something but an AEDesc is a struct consisting of two
  1671. fields.  The first is the DescType and you can read it directly.  The
  1672. second is the dataHandle and its contents are private to the AppleEvent
  1673. Manager (although they're obvious in most cases).
  1674.  
  1675. Accessing the DescType is simply a matter of looking at it:
  1676.  
  1677. result = tempDesc.descriptorType;
  1678.  
  1679. Calling AEDisposeDesc does set the descriptorType to typeNull.
  1680.  
  1681. < --Stuart A. Malone
  1682. < MIT Lab for Advanced Technology in the Humanities
  1683.  
  1684. ____________________________________________________________________
  1685. Brian  Stern  {:-{)}                          BrianS@pbcomputing.com
  1686. Toolbox commando and Menu bard.             Will FlushCache for Cash
  1687.  
  1688. +++++++++++++++++++++++++++
  1689.  
  1690. >From Stuart A. Malone <samalone@mit.edu>
  1691. Date: 24 May 1995 18:04:20 GMT
  1692. Organization: Massachusetts Institute of Technology
  1693.  
  1694. Thanks for the response, Brian.
  1695.  
  1696. Perhaps I confused matters in my example by using the type DescType,
  1697. which is also the type of the descriptorType slot of the AEDesc.  Please
  1698. understand that my question is not about extracting the _type_ of the
  1699. AEDesc, but the _value_ of the AEDesc.  It just so happens that in the
  1700. example I provided, the value _is_ of type DescType.
  1701.  
  1702. Let me choose a second example, which might be less confusing.  Suppose
  1703. that I have an AEDesc that I wish to convert to a long.  I look at the
  1704. descriptorType, and see that it is indeed typeLongInteger.  Great!
  1705.  
  1706. How do I extract the long from the AEDesc without doing nasty coercions
  1707. on the dataHandle, which as Brian says, is "private to the AppleEvent
  1708. Manager"?
  1709.  
  1710. --Stuart A. Malone
  1711. MIT Lab for Advanced Technology in the Humanities
  1712.  
  1713. +++++++++++++++++++++++++++
  1714.  
  1715. >From ldo@waikato.ac.nz (Lawrence D9Oliveiro)
  1716. Date: Fri, 26 May 1995 14:04:19 +1200
  1717. Organization: University of Waikato
  1718.  
  1719. In article <3pveti$hmu@senator-bedfellow.MIT.EDU>, Stuart A. Malone
  1720. <samalone@mit.edu> wrote:
  1721.  
  1722. >What is the best way of extracting primitive data (like a DescType) from
  1723. >an AEDesc?
  1724.  
  1725. Just copy it straight out.
  1726.  
  1727. >The best I've been able to come up with is:
  1728. >
  1729. >    DescType ExtractDescType(const AEDesc * originalDesc)
  1730. >    {
  1731. >        AEDesc    tempDesc;
  1732. >        DescType  result;
  1733. >
  1734. >        OSErr err = AECoerceDesc(originalDesc, typeType, &tempDesc);
  1735. >        if (err != noErr) throw err;
  1736. >
  1737. >        result = **((DescType **)tempDesc.dataHandle);
  1738. >        AEDisposeDesc(&tempDesc);
  1739. >
  1740. >        return result;
  1741. >    }
  1742.  
  1743. This looks OK. In Modula-2, I use the following utility routines:
  1744.  
  1745.     PROCEDURE CoerceToPtr
  1746.       (
  1747.         VAR TheDesc : AEDesc;
  1748.         ToType : DescType;
  1749.         ToData : ADDRESS;
  1750.         ToDataSize : Size;
  1751.         VAR Err : OSErr
  1752.       );
  1753.       (* coerces the data in the descriptor to the specified
  1754.         type and returns it at the specified location. *)
  1755.  
  1756.         VAR
  1757.             ResultDesc : AEDesc;
  1758.  
  1759.     BEGIN
  1760.         IF TheDesc.descriptorType = ToType THEN
  1761.           (* just copy the data straight out *)
  1762.             BlockMoveData(TheDesc.dataHandle^, ToData, ToDataSize);
  1763.             Err := noErr
  1764.         ELSE
  1765.             InitAEDesc(ResultDesc);
  1766.             Err := AECoerceDesc
  1767.               (
  1768.                 (*@theAEDesc :=*) TheDesc,
  1769.                 (*toType :=*) ToType,
  1770.                 (*@result :=*) ResultDesc
  1771.               );
  1772.             IF Err = noErr THEN
  1773.                 BlockMoveData(ResultDesc.dataHandle^, ToData, ToDataSize)
  1774.             END (*IF*);
  1775.             DisposeAEDesc(ResultDesc)
  1776.         END (*IF*)
  1777.     END CoerceToPtr;
  1778.  
  1779.     PROCEDURE CoerceToBlock
  1780.       (
  1781.         VAR TheDesc : AEDesc;
  1782.         ToType : DescType;
  1783.         VAR ToData : ARRAY OF BYTE;
  1784.         VAR Err : OSErr
  1785.       );
  1786.       (* coerces the data in the descriptor to the specified
  1787.         type and returns it at the specified location. *)
  1788.  
  1789.     BEGIN
  1790.         CoerceToPtr
  1791.           (
  1792.             (*@TheDesc :=*) TheDesc,
  1793.             (*ToType :=*) ToType,
  1794.             (*ToData :=*) ADR(ToData),
  1795.             (*ToDataSize :=*) SIZE(ToData),
  1796.             (*@Err :=*) Err
  1797.           )
  1798.     END CoerceToBlock;
  1799.  
  1800. The latter one is particularly convenient, since the compiler
  1801. automatically passes the size of the object for me. You could simulate
  1802. this in C with a macro.
  1803.  
  1804. >But it bothers me that I have to extract the data using brute-force
  1805. >coercion, especially since Apple was saying at WWDC '95 that Copland is
  1806. >going to move to a pointer-based implementation of AppleScript.
  1807.  
  1808. It doesn't matter what they say. They can't break the existing API, can they?
  1809.  
  1810. +++++++++++++++++++++++++++
  1811.  
  1812. >From jwbaxter@olympus.net (John W. Baxter)
  1813. Date: Wed, 24 May 1995 14:13:38 -0700
  1814. Organization: Internet for the Olympic Peninsula
  1815.  
  1816. In article <3pveti$hmu@senator-bedfellow.MIT.EDU>, Stuart A. Malone
  1817. <samalone@mit.edu> wrote:
  1818.  
  1819. > What is the best way of extracting primitive data (like a DescType) from
  1820. > an AEDesc?  Several of the other types in OSA have routines that will
  1821. > extract some portion of the data to a pointer in a particular format:
  1822. >     AppleEvent:      AEGetParamPtr
  1823. >     AERecord:        AEGetKeyPtr
  1824. >     AEDescList:      AEGetNthPtr
  1825. > However, there does not seem to be any corresponding routine when using a
  1826. > raw AEDesc.  This comes up, for example, when writing object accessor
  1827. > functions, where the keyForm argument is passed in as an AEDesc.
  1828. > The best I've been able to come up with is:
  1829. >     DescType ExtractDescType(const AEDesc * originalDesc)
  1830. >     {
  1831. >         AEDesc    tempDesc;
  1832. >         DescType  result;
  1833. >         OSErr err = AECoerceDesc(originalDesc, typeType, &tempDesc);
  1834. >         if (err != noErr) throw err;
  1835. >         result = **((DescType **)tempDesc.dataHandle);
  1836. >         AEDisposeDesc(&tempDesc);
  1837. >         return result;
  1838. >     }
  1839.  
  1840. For a variety of reasons, if you can use the AE...Ptr () series, rather
  1841. than the AE...Desc () series of calls, you're better off.  In the case of
  1842. typeType, you can (unless you are allowing for a list of typeTypes...there
  1843. you ask for a list (using AEGetParamDesc(), and then ask for each one by
  1844. pointer).  Just ask for the value more directly using AEGetParamPtr ()
  1845. rather than AEGetParamDesc ().  You can include the coercion directly in
  1846. the AEGetParamPtr ().
  1847.  
  1848. The AE...Ptr () series is better because it saves some Memory Manager
  1849. activity (one NewHandle/DisposeHandle pair) and because you don't have a
  1850. descriptor you can forget to dispose.  
  1851.  
  1852. > But it bothers me that I have to extract the data using brute-force
  1853. > coercion, especially since Apple was saying at WWDC '95 that Copland is
  1854. > going to move to a pointer-based implementation of AppleScript.  Does
  1855. > anybody have a better way to accomplish this?
  1856.  
  1857. The AE...Ptr () series should also help insulate you from whatever changes
  1858. are made at Copland time. 
  1859.  
  1860. If you remember that an AppleEvent isn't really a collection of
  1861. descriptors for attributes and parameters, but just one flattened mass,
  1862. that can make it easier to use the ...Ptr series.  [Same is <currently>
  1863. true for lists and records...AppleEvent is basically two AERecords laid
  1864. end to end (attributes, then parameters).  With some up-front boilerplate,
  1865. including offsets to the attribute record and the parameter record.]
  1866.  
  1867. Reading the AEGizmoes code from Jens Alfke may help....on the other hand,
  1868. it may cause terminal confusion.  [It's good code; the subject matter is
  1869. confusing.]
  1870.  
  1871. - -------
  1872. Unfortunately, one case which forces AEDesc () usage for the output is
  1873. explicit coercion calls.  Other forced AEDesc uses are in the Object Model
  1874. library area.
  1875.  
  1876. -- 
  1877. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1878.        I don't do windows.
  1879.    jwbaxter@pt.olympus.net
  1880.  
  1881. ---------------------------
  1882.  
  1883. >From pauls101@aol.com (PaulS101)
  1884. Subject: Getting rid of Option-
  1885. Date: 19 May 1995 23:49:40 -0400
  1886. Organization: America Online, Inc. (1-800-827-6364)
  1887.  
  1888.    This may sound like a simple question, but it has me beat!
  1889.    Is there any simple way to convert an option-key combo to the plain
  1890. key? (or from the keyboard location code to the char.)
  1891.    I'm presently using a table lookup and it stinks (I want to eventually
  1892. support customable menus.)  I can't just use Mercutio because I don't have
  1893. the time to build it into PowerPlant just now.
  1894.    It seems like KeyTrans() should do this somehow, but I can't seem to
  1895. figure it out and I don't have the time to do exhaustive experimenting. 
  1896. Has anyone else solved this?
  1897.  
  1898. Thanks all,
  1899. Paul
  1900.  
  1901. +++++++++++++++++++++++++++
  1902.  
  1903. >From grobbins@znet.com (Grobbins)
  1904. Date: Mon, 22 May 1995 22:06:01 -0700
  1905. Organization: Skunkworks
  1906.  
  1907. In article <3pjosk$2g9@newsbf02.news.aol.com>, pauls101@aol.com (PaulS101)
  1908. wrote:
  1909. >   Is there any simple way to convert an option-key combo to the plain
  1910. >key? (or from the keyboard location code to the char.)
  1911.  
  1912. If you have the virtual keyCode and modifiers from the EventRecord, just
  1913. munge the modifiers and pass them to KeyTrans.  That would look something
  1914. like this, where state is initially zero:
  1915.  
  1916.   kchrNum = GetScript(GetEnvirons(smKeyScript), smScriptKeys)
  1917.   kchrResHandle = RGetResource('KCHR', kchrNum);
  1918.   if (kchrResHandle != nil) {
  1919.     modifiedKeyCode =
  1920.       ((keyCode & 0x007F) | (alteredModifiers & 0xFF80));
  1921.     theChar = KeyTrans(*kchrResHandle, modifiedKeyCode, &state);
  1922.   }
  1923.  
  1924.  
  1925. Grobbins                            grobbins@znet.com
  1926.  
  1927. ---------------------------
  1928.  
  1929. >From lehmann@bert.cs.byu.edu (Ralf Lehmann)
  1930. Subject: How to disable Text Item ?
  1931. Date: 25 May 1995 21:02:44 GMT
  1932. Organization: Brigham Young University
  1933.  
  1934. How does one disable a text item in a Dialog ? I tried
  1935. GetDItem and SetDItem, modifying the 8th bit in the
  1936. iType field, but I still get the blinking caret in the 
  1937. field and I'm still able to enter chars (with only a
  1938. minor behavior difference in ModalDialog: it returns
  1939. only once I hit another item).
  1940. Any help welcome.
  1941.  
  1942. Ralf.
  1943.  
  1944. +++++++++++++++++++++++++++
  1945.  
  1946. >From mpatrick@direct.ca (Mel Patrick)
  1947. Date: Thu, 25 May 1995 16:14:05 -0700
  1948. Organization: Internet Direct, Inc.
  1949.  
  1950. In article <lehmann-2505951506050001@iago.cs.byu.edu>,
  1951. lehmann@bert.cs.byu.edu (Ralf Lehmann) wrote:
  1952.  
  1953. > How does one disable a text item in a Dialog ? I tried
  1954. > GetDItem and SetDItem, modifying the 8th bit in the
  1955. > iType field, but I still get the blinking caret in the 
  1956. > field and I'm still able to enter chars (with only a
  1957. > minor behavior difference in ModalDialog: it returns
  1958. > only once I hit another item).
  1959. > Any help welcome.
  1960. > Ralf.
  1961.  
  1962. Look for a toolbox routine called HIDEDITEM(DLOGPtr,theItem). Basically it
  1963. moves the dialog item off screen and kills the textedit update from
  1964. happening to the field. Of course this answer assumes that you want the
  1965. item not to be visible. Which incidently your message didn't say (a point
  1966. in future might be to explain what results you want)...
  1967.  
  1968. If all you want to do is deactivate the edit field itself, look for the
  1969. toolbox routine called, "TEDeactivate(hTe)". Use the GETDITEM to get a
  1970. handle to edit field, and then the tedeactivate to stop the caret from
  1971. doing its thing.
  1972.  
  1973. -- 
  1974. Mel Patrick
  1975. mpatrick@direct.ca
  1976.  
  1977. +++++++++++++++++++++++++++
  1978.  
  1979. >From davep@leonardo.lmt.com (Dave Polaschek)
  1980. Date: Fri, 26 May 1995 06:51:17 -0500
  1981. Organization: LaserMaster
  1982.  
  1983. In article <lehmann-2505951506050001@iago.cs.byu.edu>,
  1984. lehmann@bert.cs.byu.edu (Ralf Lehmann) wrote:
  1985.  
  1986. > How does one disable a text item in a Dialog ? I tried
  1987. > GetDItem and SetDItem, modifying the 8th bit in the
  1988. > iType field, but I still get the blinking caret in the 
  1989. > field and I'm still able to enter chars (with only a
  1990. > minor behavior difference in ModalDialog: it returns
  1991. > only once I hit another item).
  1992. > Any help welcome.
  1993. > Ralf.
  1994.  
  1995. The way I handle it is to 1) TESetSelect() the selection to nothing,
  1996. 2) TEDeactivate the current editText item (if the item I'm disabling is
  1997. the current one), 3) Select the next editText item's text, 4) change the
  1998. type of the item from editText to statText, 5) get the rectangle that
  1999. covers the item and the frame (InsetRect(&itemRect,-4,-4)) and 6) 
  2000. EraseRect() and InvalRect() that rectangle so the item is forced to
  2001. redraw.
  2002.  
  2003. This avoid the problem of still having TextEdit think the cursor's
  2004. still in an item I've turned off. If you don't have another editText
  2005. item to select, things get trickier. You'll need to do the TESetSelect
  2006. and TEDeactivate, though.
  2007.  
  2008. -DaveP
  2009. -- 
  2010. Dave Polaschek -- work:davep@county.lmt.com -- home:davep@eworld.com
  2011. Vending machines SHOULD respond to a [finger] request with a list of
  2012. all items currently available for purchase... -RFC1288
  2013.  
  2014. +++++++++++++++++++++++++++
  2015.  
  2016. >From sped@lfso.ifa.hawaii.edu (Byron Han)
  2017. Date: Fri, 26 May 1995 20:14:44 GMT
  2018. Organization: Institute for Astronomy, Hawaii
  2019.  
  2020. In article <lehmann-2505951506050001@iago.cs.byu.edu> lehmann@bert.cs.byu.edu (Ralf Lehmann) writes:
  2021. >How does one disable a text item in a Dialog ? I tried
  2022. >GetDItem and SetDItem, modifying the 8th bit in the
  2023. >iType field, but I still get the blinking caret in the 
  2024. >field and I'm still able to enter chars (with only a
  2025. >minor behavior difference in ModalDialog: it returns
  2026. >only once I hit another item).
  2027. >Any help welcome.
  2028.  
  2029. Call HideDItem, GetDItem, SetDItem, ShowDItem
  2030.  
  2031. The SetDItem is used to change the item type from editText to statText.
  2032. The Hide/Show are required to have the dialog manager take care of
  2033. deactivating the text edit item.
  2034.  
  2035.  
  2036. --
  2037.  Byron Han, Graduate Student        University of Hawai`i at Mano`a
  2038.  Institute for Astronomy                 Email: sped@ifa.hawaii.edu
  2039.  Quote: "Given current global population growth rates, reproduction 
  2040.                   will soon no longer be a right but a priviledge."
  2041.  
  2042. ---------------------------
  2043.  
  2044. >From quinlan@kits.sfu.ca (Brian Quinlan)
  2045. Subject: To OOP or not to OOP. That...
  2046. Date: 10 May 95 07:25:44 GMT
  2047. Organization: Simon Fraser University
  2048.  
  2049. I'm writing a medium sized program right now using a combination of object
  2050. oriented and procedural code. For example, I use objects for my windows and
  2051. most of my data structures but not my event loop. I can't seem to decide
  2052. whether to use object oriented techniques on code that, if it was object
  2053. oriented, could have only one instance. For example, why would I make my
  2054. preferences code into an object? It could have only one instance and wouldn't
  2055. provide any additional abstraction. Any opinions? 
  2056.  
  2057. Brian Quinlan
  2058. quinlan@sfu.ca
  2059.  
  2060. -- 
  2061.  
  2062. Brian Quinlan
  2063. quinlan@sfu.ca
  2064.  
  2065. +++++++++++++++++++++++++++
  2066.  
  2067. >From popovic@minerva.cis.yale.edu (Igor Popovic)
  2068. Date: 12 May 1995 04:23:30 GMT
  2069. Organization: Yale University
  2070.  
  2071. Brian Quinlan (quinlan@kits.sfu.ca) wrote:
  2072. : I'm writing a medium sized program right now using a combination of object
  2073. : oriented and procedural code. For example, I use objects for my windows and
  2074. : most of my data structures but not my event loop. I can't seem to decide
  2075. : whether to use object oriented techniques on code that, if it was object
  2076. : oriented, could have only one instance. For example, why would I make my
  2077. : preferences code into an object? It could have only one instance and wouldn't
  2078. : provide any additional abstraction. Any opinions? 
  2079.  
  2080. there probably is no immediately apparent advantage in having your
  2081. preferences objectified (for example) but in the long run and in a large 
  2082. program it might be convenient to have a class CPreferenceServer (or 
  2083. CPreferenceManager or something along these lines) with just 
  2084. one instance (presumably a global one), mainly as a means to
  2085. bundle a bunch of preference-related functions (reading, setting,
  2086. saving ...) as methods. but i guess it's really mainly a matter
  2087. of style, for me it helps to think of my programs as a bunch of
  2088. specialized objects, each responsible for a specific task or class
  2089. of tasks, ideally sitting in its own source file and quite
  2090. independent of the others. --Igor++ 
  2091.  
  2092. +++++++++++++++++++++++++++
  2093.  
  2094. >From BrianS@pbcomputing.com (Brian Stern)
  2095. Date: Thu, 11 May 1995 23:51:12 -0500
  2096. Organization: The University of Texas at Austin, Austin, Texas
  2097.  
  2098. In article <quinlan.800090744@sfu.ca>, quinlan@kits.sfu.ca (Brian Quinlan)
  2099. wrote:
  2100.  
  2101. < I'm writing a medium sized program right now using a combination of object
  2102. < oriented and procedural code. For example, I use objects for my windows and
  2103. < most of my data structures but not my event loop. I can't seem to decide
  2104. < whether to use object oriented techniques on code that, if it was object
  2105. < oriented, could have only one instance. For example, why would I make my
  2106. < preferences code into an object? It could have only one instance and wouldn't
  2107. < provide any additional abstraction. Any opinions? 
  2108. < Brian Quinlan
  2109. < quinlan@sfu.ca
  2110.  
  2111. If you ever write a second application you might reuse your preferences
  2112. class.  I've written a prefs class (actually I've got a version for TCL
  2113. and one for PP).  This class inherits from the file class of the framework
  2114. so it automatically knows about opening, closing, specifying, and other
  2115. file related stuff.  My prefs base class knows about the Preferences
  2116. folder, it knows how to read in the preferences handle, it knows how to
  2117. create itself if it doesn't exist and it's asked to open itself, it knows
  2118. how to update the preferences handle if it's dirty.  The derived class
  2119. provides the name and creator of the file, it allocates the prefs handle
  2120. and fills it with the default values, and it provides the accessor
  2121. function(s) as needed.  Reuse of this class means that I'll only have to
  2122. write a constructor that is a few lines and the createdefault methods. 
  2123. (If I'm good I'll write the verifyprefs method as well).
  2124.  
  2125. The event loop is exactly the sort of code that I don't want to look at. 
  2126. When I start a new project I don't want to start cutting and pasting event
  2127. loops and handleMouseDown code from my old projects.  I just want to
  2128. inherit from a nice application class that takes care of all that and
  2129. calls my code when something interesting is going to happen.
  2130.  
  2131. I find that working like this saves my time and things tend to work
  2132. better, sooner.
  2133.  
  2134. Cheers,
  2135.  
  2136. ____________________________________________________________________
  2137. Brian  Stern  {:-{)}                          BrianS@pbcomputing.com
  2138. Toolbox commando and Menu bard.             Will FlushCache for Cash
  2139.  
  2140. +++++++++++++++++++++++++++
  2141.  
  2142. >From Willy.DeWaele@ping.be (WDW)
  2143. Date: Fri, 12 May 1995 00:32:25 +0200
  2144. Organization: PING Belgium
  2145.  
  2146. In article <quinlan.800090744@sfu.ca>, quinlan@kits.sfu.ca (Brian Quinlan)
  2147. wrote:
  2148.  
  2149. >For example, why would I make my
  2150. >preferences code into an object? It could have only one instance and wouldn't
  2151. >provide any additional abstraction. Any opinions? 
  2152. >
  2153. >Brian Quinlan
  2154.  
  2155. Yes, to re-use of your code, in the future you can use the same class (from your library) or eventually create a subclass with trivial overridings.
  2156. In some frameworks (ie MacApp) there is even a class for Str255, IMHO this goes too far ...
  2157.  
  2158. Willy
  2159.  
  2160. -- 
  2161. Willy De Waele
  2162. Internet: Willy.DeWaele@ping.be                  AppleLink: DEWAELE.W
  2163. TAKE & GIVE (GUIDE)
  2164.  
  2165. +++++++++++++++++++++++++++
  2166.  
  2167. >From 3gl21@qlink.queensu.ca (Gregory Lo)
  2168. Date: Fri, 12 May 1995 06:54:23 -0400
  2169. Organization: Queen's University
  2170.  
  2171. In article <3ouns2$oku@news.ycc.yale.edu>, popovic@minerva.cis.yale.edu
  2172. (Igor Popovic) wrote:
  2173.  
  2174. >Brian Quinlan (quinlan@kits.sfu.ca) wrote:
  2175. >: I'm writing a medium sized program right now using a combination of object
  2176. >: oriented and procedural code. For example, I use objects for my windows and
  2177. >: most of my data structures but not my event loop. I can't seem to decide
  2178. >: whether to use object oriented techniques on code that, if it was object
  2179. >: oriented, could have only one instance. For example, why would I make my
  2180. >: preferences code into an object? It could have only one instance and wouldn't
  2181. >: provide any additional abstraction. Any opinions? 
  2182. >
  2183.  
  2184. [Everything Igor said goes for me too]
  2185.  
  2186. I agree with all of what Igor wrote in reply.  I also think that a
  2187. well-built preference class helps in terms of code reuse.  You could use
  2188. the same basic code in several different projects, with a minimum of
  2189. modification for specialized functionality.
  2190.  
  2191. - ---------------------------------------------------------
  2192. Gregory Lo  GLo ?:^(>      <mailto:3gl21@qlink.queensu.ca>
  2193. <mailto:log@declab.queensu.ca>      <mailto:greglo@io.org>
  2194.  
  2195. +++++++++++++++++++++++++++
  2196.  
  2197. >From pottier@felouque.ens.fr (Francois Pottier)
  2198. Date: 12 May 1995 12:11:22 GMT
  2199. Organization: Ecole Normale Superieure, Paris
  2200.  
  2201. In article <quinlan.800090744@sfu.ca>,
  2202. Brian Quinlan <quinlan@kits.sfu.ca> wrote:
  2203.  
  2204. >oriented, could have only one instance. For example, why would I make my
  2205. >preferences code into an object? It could have only one instance and wouldn't
  2206. >provide any additional abstraction. Any opinions? 
  2207.  
  2208. My preferences class has one virtual method, GetDefaultSetting,
  2209. whose job is to provide default settings. This way the base class
  2210. is the same for all programs I write, and I override it in each
  2211. program to define defaults. Looks great.
  2212.  
  2213.  
  2214.  
  2215. -- 
  2216. Francois Pottier                                            pottier@dmi.ens.fr
  2217. - ----------------------------------------------------------------------------
  2218. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/ ...
  2219.  
  2220. +++++++++++++++++++++++++++
  2221.  
  2222. >From alain@cs.uchicago.edu (Alain Roy)
  2223. Date: Fri, 12 May 1995 13:57:03 GMT
  2224. Organization: None
  2225.  
  2226. In article <BrianS-1105952351120001@slip-2-35.ots.utexas.edu>,
  2227. BrianS@pbcomputing.com (Brian Stern) wrote:
  2228.  
  2229. >If you ever write a second application you might reuse your preferences
  2230. >class.
  2231.  
  2232. I recently wrote a bunch of C code to deal with preferences. 
  2233.  
  2234. When I moved it to another application, it took about 5 minutes or less to
  2235. get it working, and that was just because the preferences themselves
  2236. changed.
  2237.  
  2238. When I moved it to yet another application that needed something different
  2239. (variable length preferences instead of static length), it took me maybe
  2240. 20 minutes to modify the code. (I suspect that the same thing would happen
  2241. in C++ if you made the same assumption of static length preferences
  2242. originally that I did.)
  2243.  
  2244. Why would C++ make my code here more reusable? I seemed to reuse it in C
  2245. just fine.
  2246.  
  2247. (This isn't a flame, but I'm honestly curious about the answer. I use C++,
  2248. but only in small doses.)
  2249.  
  2250. -alain
  2251.  
  2252. +++++++++++++++++++++++++++
  2253.  
  2254. >From dwhitney@CS.Stanford.EDU (David J. Whitney)
  2255. Date: 13 May 1995 01:07:26 GMT
  2256. Organization: Computer Science Department, Stanford University.
  2257. In article <alain-1205950857030001@hammer.uchicago.edu>, alain@cs.uchicago.edu (Alain Roy) writes:
  2258. |> In article <BrianS-1105952351120001@slip-2-35.ots.utexas.edu>,
  2259. |> BrianS@pbcomputing.com (Brian Stern) wrote:
  2260. |> 
  2261. |> >If you ever write a second application you might reuse your preferences
  2262. |> >class.
  2263. |> 
  2264. |> I recently wrote a bunch of C code to deal with preferences. 
  2265. |> 
  2266. |> When I moved it to another application, it took about 5 minutes or less to
  2267. |> get it working, and that was just because the preferences themselves
  2268. |> changed.
  2269. |> 
  2270. |> When I moved it to yet another application that needed something different
  2271. |> (variable length preferences instead of static length), it took me maybe
  2272. |> 20 minutes to modify the code. (I suspect that the same thing would happen
  2273. |> in C++ if you made the same assumption of static length preferences
  2274. |> originally that I did.)
  2275. |> 
  2276. |> Why would C++ make my code here more reusable? I seemed to reuse it in C
  2277. |> just fine.
  2278. |> 
  2279. |> (This isn't a flame, but I'm honestly curious about the answer. I use C++,
  2280. |> but only in small doses.)
  2281.  
  2282. The issue here isn't really C++ vs C.  Sure an object and a well written C
  2283. library can operate very similarly.  What is important is Object Oriented
  2284. *Design*.  Thinking of things in terms of data, and not in terms of functions.
  2285. That is what has saved me countless hours of C code tweaking and subsequent
  2286. ripple effects through out the rest of my code.
  2287.  
  2288. The gain with OOP is that when you have 20 applications based on that
  2289. Preference Manager and you come a across a bug, you have to change it 20
  2290. times.  Or just fix your object and relink.  Note that this can be said also
  2291. of a well written C library with consistent API.  But how many consistent APIs
  2292. do you have lying around?  OOP forces (allows, encourages?) you to have a 
  2293. consistent API to your objects.  
  2294.  
  2295. But even more, it is thinking in terms of data.  Procedures fall out from what
  2296. the data is you are using.  Not the other way around.  I took a 5 day class
  2297. (work paid) on Object oriented design (anyone can pick up C++), and that
  2298. changed my outlook completely.  It's hard to describe, and making the switch
  2299. *is* hard, but my life is so much simpler now.  Given the choice between
  2300. learning OO programming and OO design, learn to design first.
  2301.  
  2302. disclaim, disclaim, disclaim.  your mileage may vary.
  2303.  
  2304. -Dave
  2305.  
  2306. -- 
  2307. ____________________________________________________________________________
  2308. David Whitney              | Cooper:  Wanna know why I'm whittling?
  2309. david.whitney@arc.nasa.gov | Truman:  OK, I'll bite.  Why are you whittling?
  2310. Graphics and Visualization | Cooper:  Because that's what you do in a
  2311. Sterling Software          |          town where a yellow light still means
  2312. NASA Ames, Mtn View, CA    |          slow down,  not speed up.
  2313.           Not an indication of Sterling or NASA's opinion
  2314.  
  2315. +++++++++++++++++++++++++++
  2316.  
  2317. >From Seth Tager <sdt>
  2318. Date: 12 May 1995 06:19:16 GMT
  2319. Organization: Brown University
  2320.  
  2321. quinlan@kits.sfu.ca (Brian Quinlan) wrote:
  2322. >I'm writing a medium sized program right now using a combination of object
  2323. >oriented and procedural code. For example, I use objects for my windows and
  2324. >most of my data structures but not my event loop. I can't seem to decide
  2325. >whether to use object oriented techniques on code that, if it was object
  2326. >oriented, could have only one instance. For example, why would I make my
  2327. >preferences code into an object? It could have only one instance and wouldn't
  2328. >provide any additional abstraction. Any opinions? 
  2329.  
  2330. I think this is an interesting question. If you already have working code and
  2331. you can't imagine the program growing beyond a managable size then you're
  2332. probably better off sticking with what you've got in order to avoid 1) having 
  2333. to debug code that already works, and 2) the possibility (or probability)
  2334. that you will wind up coding yourself into spaghetti by incrementally designing
  2335. and implementing the "once-only" application code. If you look at some mature
  2336. application frameworks (the Think Class Library, for example) you'll see that
  2337. they manage to get reuse and maintainability out of some of the ways that
  2338. they use their application classes (which take care of things like the event
  2339. loop).
  2340.  
  2341. As far as something like preferences goes, there are ways you could save
  2342. yourself some work by identifying the abstract behavior of preferences.
  2343. For example, are preferences saved in resources, as a separate data file,
  2344. or some other way? (or a combination of these) The mechanism for storing data 
  2345. is something that you'll probably use more than once. If not in this program
  2346. then definitely in the next. If you can establish a scheme that works for you
  2347. then you'll save yourself time in the long run.
  2348.  
  2349. Commercial frameworks are something to consider (eventually). If you're far
  2350. enough along with the project you're working on then you might want to just
  2351. get it finished. The good things about established frameworks is that
  2352. someone (expert?) has spent a lot of time working out the problems. They're
  2353. good to study just to get some ideas. Drawbacks are 1) steep
  2354. learning curve and 2) you become heavily invested in someone else's work. If
  2355. it breaks or becomes obsolete (they stop supporting it) your out of luck.
  2356.  
  2357. Hope this helps,
  2358. Seth
  2359.  
  2360.  
  2361. +++++++++++++++++++++++++++
  2362.  
  2363. >From sandvik@apple.com (Kent Sandvik)
  2364. Date: Sun, 14 May 1995 19:22:46 -0800
  2365. Organization: Apple Computer, Inc. Developer Technical Support
  2366.  
  2367. In article <quinlan.800090744@sfu.ca>, quinlan@kits.sfu.ca (Brian Quinlan)
  2368. wrote:
  2369.  
  2370. > I'm writing a medium sized program right now using a combination of object
  2371. > oriented and procedural code. For example, I use objects for my windows and
  2372. > most of my data structures but not my event loop. I can't seem to decide
  2373. > whether to use object oriented techniques on code that, if it was object
  2374. > oriented, could have only one instance. For example, why would I make my
  2375. > preferences code into an object? It could have only one instance and wouldn't
  2376. > provide any additional abstraction. Any opinions? 
  2377.  
  2378. If it ain't broke, don't fix it. I've seen cases where programmers rewrite
  2379. fully working code just because it's not object oriented.
  2380.  
  2381. If you really want to start breaking out usable modules, you could indeed
  2382. write a preferencefile class, or something similar, instantiate it  and
  2383. use it inside your procedural environment. Then again if you spend a lot
  2384. of time writing a class, and all it does is to read and write a simple
  2385. preference setting, maybe a WriteMyPreferences() and ReadMyPreferences()
  2386. is all you need. I also think that copy/paste is a very powerful code
  2387. reusability technique.
  2388.  
  2389. --Kent
  2390.  
  2391. -- 
  2392. Kent Sandvik   sandvik@apple.com                  Working with Multimedia stuff...
  2393. Apple Developer Technical Support.                                     Private activities on Internet.
  2394.  
  2395. +++++++++++++++++++++++++++
  2396.  
  2397. >From pottier@brick.ens.fr (Francois Pottier)
  2398. Date: 15 May 1995 11:20:32 GMT
  2399. Organization: Ecole Normale Superieure, Paris
  2400.  
  2401. In article <sandvik-1405951922460001@17.255.38.116>,
  2402. Kent Sandvik <sandvik@apple.com> wrote:
  2403.  
  2404. >I also think that copy/paste is a very powerful code
  2405. >reusability technique.
  2406.  
  2407. But it becomes a pain when your code is shared between several
  2408. projects.  And that is bound to happen to all professionals and even
  2409. serious hobbyists.
  2410.  
  2411. -- 
  2412. Francois Pottier                                            pottier@dmi.ens.fr
  2413. - ----------------------------------------------------------------------------
  2414. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/ ...
  2415.  
  2416. +++++++++++++++++++++++++++
  2417.  
  2418. >From mhl@icf.hrb.com (Mark H. Linton)
  2419. Date: 15 May 95 11:42:05 EST
  2420. Organization: HRB Systems, Inc.
  2421.  
  2422. In article <3p10oe$a7t@Radon.Stanford.EDU>, 
  2423.    dwhitney@CS.Stanford.EDU (David J. Whitney) writes:
  2424. > The issue here isn't really C++ vs C.  
  2425.  
  2426. True statement...
  2427.  
  2428. > Sure an object and a well written C library can operate very similarly.  
  2429.  
  2430. In fact they can be identical (e.g. CFront)
  2431.  
  2432. > What is important is Object Oriented *Design*.  
  2433.  
  2434. Again, true.
  2435.  
  2436. > Thinking of things in terms of data, and not in terms of functions.
  2437.  
  2438. You are thinking of Jackson Structured Design (JSD) originally
  2439. described by Micheal Jackson (not the singer). Also, my personal
  2440. favorite =^) although, not the ONLY OOD technique. Booch comes to
  2441. mind fairly quickly.
  2442.  
  2443. > That is what has saved me countless hours of C code tweaking and
  2444. > subsequent ripple effects through out the rest of my code.
  2445.  
  2446. To be replaced by countless hours of C++ code tweaking, perhaps? =^)
  2447.  
  2448. > The gain with OOP is that when you have 20 applications based on
  2449. > that Preference Manager and you come a across a bug, you have to
  2450. > change it 20 times.  Or just fix your object and relink.  
  2451.  
  2452. Or just fix your library and relink.
  2453.  
  2454. > Note that this can be said also of a well written C library with
  2455. > consistent API.  But how many consistent APIs do you have lying
  2456. > around?  
  2457.  
  2458. For the naive reader, note here that the comment about the
  2459. consistency of APIs does not mention languages. It is just as easy
  2460. to write an inconsistent API in C++ as with C. And, in fact, this
  2461. is the case. The API is a function of the designer and not the
  2462. language. OOA/OOD/OOP is an attempt to educate the designers. C++
  2463. does support enforcement mechanisms for some of the concepts, but
  2464. they do not force you to do a good design. Design pre-dates
  2465. coding, so that by the time you get to your first compile (the
  2466. first chance the language gets to help you) it is already too
  2467. late. This was Grady Booch's idea in trying to develop tools that
  2468. would allow you to do OOA/OOD before you had to worry about doing
  2469. OOP.
  2470.  
  2471. > OOP forces (allows, encourages?) you to have a 
  2472. > consistent API to your objects.
  2473.  
  2474. False. OOP forces you to STICK TO you consistent API assuming that
  2475. you have put one in place in your design. It also allows you to
  2476. modify your IMPLEMENTATION of you design without breaking your
  2477. API.
  2478.  
  2479. > But even more, it is thinking in terms of data.  Procedures fall
  2480. > out from what the data is you are using.  Not the other way
  2481. > around.  I took a 5 day class (work paid) on Object oriented
  2482. > design (anyone can pick up C++), and that changed my outlook
  2483. > completely.  It's hard to describe, and making the switch *is*
  2484. > hard, but my life is so much simpler now.  Given the choice
  2485. > between learning OO programming and OO design, learn to design
  2486. > first.
  2487.  
  2488. ...and this explains why he has a consistent API (me too, BTW)...
  2489.  
  2490. Definitely, most emphatically, YES. Take a class at your local
  2491. university. Even if you consider yourself an expert, it will be a
  2492. real eye-opener. I figure your future is worth a couple of hundred
  2493. bucks (your employeer should, also).
  2494.  
  2495. > disclaim, disclaim, disclaim.  your mileage may vary.
  2496.  
  2497. Not really a flame, just a clarification. =^)
  2498.  
  2499. > -Dave
  2500. > -- 
  2501. > ____________________________________________________________________________
  2502. > David Whitney              | Cooper:  Wanna know why I'm whittling?
  2503. > david.whitney@arc.nasa.gov | Truman:  OK, I'll bite.  Why are you whittling?
  2504. > Graphics and Visualization | Cooper:  Because that's what you do in a
  2505. > Sterling Software          |          town where a yellow light still means
  2506. > NASA Ames, Mtn View, CA    |          slow down,  not speed up.
  2507. >           Not an indication of Sterling or NASA's opinion
  2508. -- 
  2509. Hope this helps.
  2510.  
  2511. Mark H. Linton
  2512. ____________________________________________________________________
  2513. mark \'mdrk\ n [ME, fr. OE mearc boundary, march, sign; akin to OHG
  2514. marha boundary, L margo] 1 a : a conspicuous object serving as a guide
  2515. for travelers 2 : A standard or criterion of quality 3 : An object or
  2516. point that serves as a guide --idiom. mark time. 1 : To make little or
  2517. no progress
  2518.  
  2519. +++++++++++++++++++++++++++
  2520.  
  2521. >From ldo@waikato.ac.nz (Lawrence D9Oliveiro)
  2522. Date: Tue, 16 May 1995 11:41:44 +1200
  2523. Organization: University of Waikato
  2524.  
  2525. In article <alain-1205950857030001@hammer.uchicago.edu>,
  2526. alain@cs.uchicago.edu (Alain Roy) wrote:
  2527.  
  2528. >In article <BrianS-1105952351120001@slip-2-35.ots.utexas.edu>,
  2529. >BrianS@pbcomputing.com (Brian Stern) wrote:
  2530. >
  2531. >>If you ever write a second application you might reuse your preferences
  2532. >>class.
  2533. >
  2534. >I recently wrote a bunch of C code to deal with preferences. 
  2535. >
  2536. >When I moved it to another application, it took about 5 minutes or less to
  2537. >get it working, and that was just because the preferences themselves
  2538. >changed.
  2539. >
  2540. >When I moved it to yet another application that needed something different
  2541. >(variable length preferences instead of static length), it took me maybe
  2542. >20 minutes to modify the code. (I suspect that the same thing would happen
  2543. >in C++ if you made the same assumption of static length preferences
  2544. >originally that I did.)
  2545. >
  2546. >Why would C++ make my code here more reusable? I seemed to reuse it in C
  2547. >just fine.
  2548.  
  2549. This is a valid question to ask, and judging from reports I've been
  2550. reading, C++ (and OOP in general) hasn't been making much difference to
  2551. the amount of code that people have been able to reuse.
  2552.  
  2553. I like to think I've been having quite a good success rate with reusable
  2554. code myself, using techniques that have little or nothing to do with
  2555. "object-orientation"--I've done a couple of fully AppleScriptable,
  2556. recordable applications with better than 60% code reuse.
  2557.  
  2558. To give you an idea of how I did it, I've just publicly released my entire
  2559. collection of standard libraries. Have a look at
  2560. <http://www2.waikato.ac.nz/ldo/sw/index.html#MyModLib>.
  2561.  
  2562. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  2563. Info & Tech Services Division              fax: +64-7-838-4066
  2564. University of Waikato            electric mail: ldo@waikato.ac.nz
  2565. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00
  2566.  
  2567. +++++++++++++++++++++++++++
  2568.  
  2569. >From ari@shore.net (Ari Halberstadt)
  2570. Date: Thu, 18 May 1995 00:19:57 -0400
  2571. Organization: North Shore Access/Eco Software, Inc; (info@shore.net)
  2572.  
  2573. In article <sandvik-1405951922460001@17.255.38.116>, sandvik@apple.com
  2574. (Kent Sandvik) wrote:
  2575.  
  2576. > In article <quinlan.800090744@sfu.ca>, quinlan@kits.sfu.ca (Brian Quinlan)
  2577. > wrote:
  2578. > > I'm writing a medium sized program right now using a combination of object
  2579. > > oriented and procedural code. For example, I use objects for my windows and
  2580. > > most of my data structures but not my event loop. I can't seem to decide
  2581. > > whether to use object oriented techniques on code that, if it was object
  2582. > > oriented, could have only one instance. For example, why would I make my
  2583. > > preferences code into an object? It could have only one instance and
  2584. wouldn't
  2585. > > provide any additional abstraction. Any opinions? 
  2586. > If it ain't broke, don't fix it. I've seen cases where programmers rewrite
  2587. > fully working code just because it's not object oriented.
  2588. > If you really want to start breaking out usable modules, you could indeed
  2589. > write a preferencefile class, or something similar, instantiate it  and
  2590. > use it inside your procedural environment. Then again if you spend a lot
  2591. > of time writing a class, and all it does is to read and write a simple
  2592. > preference setting, maybe a WriteMyPreferences() and ReadMyPreferences()
  2593. > is all you need. I also think that copy/paste is a very powerful code
  2594. > reusability technique.
  2595.  
  2596. Sometimes it ain't broke until the system changes. I have a C program I
  2597. was working on, and it stored prefs as bitmapped structures (not
  2598. graphics!). This was all fine and dandy with 68k programs, but became a
  2599. pain with PPC programs. I'd have things like this in my code (which I did
  2600. to get a quick port):
  2601.  
  2602. /* comment to explain this mess */
  2603. #if PRAGMA_ALIGN_AVAILABLE // shut up THINK C
  2604.    #pragma align=mac68k
  2605. #endif
  2606. typedef struct {
  2607.    short font;
  2608.    short style;
  2609.    ...
  2610. } tPortTextSettings;
  2611. #if PRAGMA_ALIGN_AVAILABLE // shut up THINK C
  2612.    #pragma align=reset
  2613. #endif
  2614.  
  2615. A pain, but it worked, assuming I remembered to keep all my pragmas in
  2616. order. But wait, I then decided to use floating point numbers to store
  2617. coordinates, so my window records contained rectangles that could be made
  2618. of floating point values. There is no such thing as a common floating
  2619. point format (there are several, but you can't convince your compiler to
  2620. use them when you need 'em), so I use extended80 since it's a mac only
  2621. program and it's easy to convert to/from long double/extended80. Whoops,
  2622. no more bitmapped structures. 
  2623.  
  2624. Time to get rid of those ugly pragmas anyway. Time for what? A streams
  2625. library. Cool, now I stream my data. Doesn't this thing come with C++? Oh
  2626. well, I wrote it from scratch. Not hard. It does have ugly switch
  2627. statements to go to file, resource, handle, pointer, not as easily
  2628. extensible as a class. Now, to save my floating point numbers, I made a
  2629. typed stream library, bundled it all together, and rewrote my data saving
  2630. routines (not too many for this app). The typed stream library does a few
  2631. other useful things.
  2632.  
  2633. In the end, I didn't change my preferences file library, but I did change
  2634. the IO routines for my preferences and other data. Hmm, I'm not sure how
  2635. this ties in with this thread, except that I think it might have been
  2636. easier to use C++, a framework, and someone else's streams (or to have
  2637. coded it that way in the first place), and it has little to do with code
  2638. reuse in this instance. Though this thread was also about prefs, so I
  2639. thought I'd babble a bit.
  2640.  
  2641. +++++++++++++++++++++++++++
  2642.  
  2643. >From sandvik@apple.com (Kent Sandvik)
  2644. Date: Wed, 17 May 1995 22:01:50 -0800
  2645. Organization: Apple Computer, Inc. Developer Technical Support
  2646.  
  2647. In article <3p7de1$m9o@nef.ens.fr>, pottier@brick.ens.fr (Francois
  2648. Pottier) wrote:
  2649.  
  2650. > In article <sandvik-1405951922460001@17.255.38.116>,
  2651. > Kent Sandvik <sandvik@apple.com> wrote:
  2652. > >I also think that copy/paste is a very powerful code
  2653. > >reusability technique.
  2654. > But it becomes a pain when your code is shared between several
  2655. > projects.  And that is bound to happen to all professionals and even
  2656. > serious hobbyists.
  2657.  
  2658. That's why I like Metrowerks and the path statement settings, most of my
  2659. common code is in a specific folder...
  2660.  
  2661. --Kent
  2662.  
  2663. -- 
  2664. Kent Sandvik   sandvik@apple.com                  Working with Multimedia stuff...
  2665. Apple Developer Technical Support.                 Private activities on Internet.
  2666.  
  2667. +++++++++++++++++++++++++++
  2668.  
  2669. >From sandvik@apple.com (Kent Sandvik)
  2670. Date: Wed, 17 May 1995 22:06:51 -0800
  2671. Organization: Apple Computer, Inc. Developer Technical Support
  2672.  
  2673. In article <ldo-1605951141440001@130.217.96.144>, ldo@waikato.ac.nz wrote:
  2674. > I like to think I've been having quite a good success rate with reusable
  2675. > code myself, using techniques that have little or nothing to do with
  2676. > "object-orientation"--I've done a couple of fully AppleScriptable,
  2677. > recordable applications with better than 60% code reuse.
  2678.  
  2679. Hear hear! Actually I program nowadays in plain C with sort of object-ism
  2680. by passing around known structures, ok I call them objects, from one
  2681. function to another. As I spend most of my time with QT programming
  2682. nowadays, I pass around movies,tracks, movie controllers and so on. I have
  2683. for instance a function for checking if a particular media type is present
  2684. in a movie, called QTUMediaTypeInTrack. It takes a movie and a media type,
  2685. returns true or false. Pretty simple, it's encapsulating code, and no C++
  2686. needed.
  2687.  
  2688. C++ is sometimes nice for hiding global state, I must admit...
  2689.  
  2690. --Kent
  2691. PS: Check out,
  2692. ftp://ftp.info.apple.com/dts/dtsqtutils.May95.hqx
  2693.  
  2694. -- 
  2695. Kent Sandvik   sandvik@apple.com                  Working with Multimedia stuff...
  2696. Apple Developer Technical Support.                 Private activities on Internet.
  2697.  
  2698. +++++++++++++++++++++++++++
  2699.  
  2700. >From jayfar@netaxs.com (Jay Farrell)
  2701. Date: Thu, 18 May 1995 09:36:53 -0500
  2702. Organization: Jayfar's Web
  2703.  
  2704. In article <sandvik-1705952206510001@17.255.38.116>, sandvik@apple.com
  2705. (Kent Sandvik) wrote:
  2706.  
  2707. [deleted]
  2708.  
  2709. > PS: Check out,
  2710. > ftp://ftp.info.apple.com/dts/dtsqtutils.May95.hqx
  2711. To which Fetch responds: No Such File...
  2712.  
  2713. Jayfar
  2714. - -------------------------------------------------------------------
  2715.  Jay Farrell                    <URL:http://www.netaxs.com/~jayfar/>
  2716.  jayfar@netaxs.com
  2717.  Philadelphia, Pennsylvania, USA
  2718.   ///////////////////////////////////////////////////////////////////
  2719.  /// The Mops Page <URL:http://www.netaxs.com/~jayfar/mops.html> ///
  2720. ///////////////////////////////////////////////////////////////////
  2721.  
  2722. +++++++++++++++++++++++++++
  2723.  
  2724. >From sandvik@apple.com (Kent Sandvik)
  2725. Date: Sun, 21 May 1995 14:54:13 -0800
  2726. Organization: Apple Computer, Inc. Developer Technical Support
  2727.  
  2728. In article <jayfar-1805950936530001@slip-794.netaxs.com>,
  2729. jayfar@netaxs.com (Jay Farrell) wrote:
  2730.  
  2731. > In article <sandvik-1705952206510001@17.255.38.116>, sandvik@apple.com
  2732. > (Kent Sandvik) wrote:
  2733. > [deleted]
  2734. > > PS: Check out,
  2735. > > ftp://ftp.info.apple.com/dts/dtsqtutils.May95.hqx
  2736. > > 
  2737. > To which Fetch responds: No Such File...
  2738.  
  2739. Ouch, sorry, me and too many URLs in my brain; the real one (after
  2740. triple-checking) is:
  2741.  
  2742. ftp://ftp.info.apple.com/dts/quicktime/dtsqtutils.May95.hqx
  2743.  
  2744. It's worth checking that quicktime sub-directory now and then as we upload
  2745. QuickTime related material into this place.
  2746.  
  2747. --Kent
  2748.  
  2749. -- 
  2750. Kent Sandvik   sandvik@apple.com                  Working with Multimedia stuff...
  2751. Apple Developer Technical Support.                 Private activities on Internet.
  2752.  
  2753. ---------------------------
  2754.  
  2755. >From dubois@uakari.primate.wisc.edu (Paul DuBois)
  2756. Subject: TransSkel 3.20 is available (CW 6 - SC++ 8)
  2757. Date: 26 May 1995 18:38:47 -0500
  2758. Organization: Castra Parvulorum
  2759.  
  2760. Release 3.20 of TransSkel, a skeleton for Macintosh application development
  2761. under MetroWerks C or Symantec C++/THINK C, is now available.
  2762.  
  2763. This is an update release; it compiles under MetroWerks CodeWarrior 6
  2764. (PPC or 68K) as well as Symantec C++ (PPC) and THINK C 8 (68K).
  2765.  
  2766. TransDisplay 3.09 and TransEdit 3.09 are also available now, and have been
  2767. updated in similar ways.  TransDisplay and TransEdit are modules that can
  2768. be dropped into TransSkel-based projects to provide display-only or editable
  2769. text windows.
  2770.  
  2771. TransSkel, TransDisplay, and TransEdit are available via any of the following:
  2772.  
  2773. anonymous ftp to ftp.primate.wisc.edu (under /pub/mac/TransSkel)
  2774.  
  2775. gopher to gopher.primate.wisc.edu, then select "Primate Center Software
  2776. Archives")
  2777.  
  2778. WWW using URL http://www.primate.wisc.edu/software/mac/TransSkel/.
  2779.  
  2780. -- 
  2781. Paul DuBois
  2782. dubois@primate.wisc.edu
  2783.  
  2784. "I'm going to learn worm-talk next," said Janetta  -- Grandaddy's Place
  2785.  
  2786. ---------------------------
  2787.  
  2788. >From schmeul@umich.edu (Sam Huffman)
  2789. Subject: malloc vs. NewPtr
  2790. Date: 17 May 1995 16:36:25 GMT
  2791. Organization: University of Michigan
  2792.  
  2793. Can anyone tell me exactly what the difference is between using the ANSI
  2794. malloc() and the Toolbox NewPtr() for allocating memory? My understanding
  2795. is that malloc is more standard and more efficient. So why would one use
  2796. NewPtr?
  2797.  
  2798. I have an ulterior motive in asking this question. In a program I am
  2799. writing I make use of several linked lists. The program must run on both
  2800. UNIX and Mac platforms, so I have been separating the interface from the
  2801. lower-level functions. To facilitate this, I tried to use malloc when
  2802. allocating memory for the list. For some reason, however, the memory
  2803. returned by malloc was already in use by the system (I first figured this
  2804. out when, after writing to one of the memory locations, my menubar turned
  2805. purple =) Upon closer examination, the memory addresses I was getting
  2806. seemed to be in the range xC02 and upward. I had always been under the
  2807. impression that lower memory values were reserved by the system. When I
  2808. switched to NewPtr, everything worked fine and my memory range seemed to
  2809. be more logical.
  2810.  
  2811. So, can anyone tell me
  2812. 1) Why malloc is giving me memory that is already in use,
  2813. 2) How I can get it to give me my own memory rather than someone else's
  2814. 3) Would I be better off just using NewPtr (time isn't critical here) and
  2815. changing it to malloc for the UNIX implementation
  2816.  
  2817. Thank you very much.
  2818.  
  2819. Sam Huffman
  2820. schmeul@umich.edu
  2821.  
  2822. +++++++++++++++++++++++++++
  2823.  
  2824. >From allender@prairienet.org (Mark W. Allender)
  2825. Date: 18 May 1995 13:06:45 GMT
  2826. Organization: Prairienet, the East-Central Illinois Free-Net
  2827.  
  2828. Sam Huffman (schmeul@umich.edu) wrote:
  2829. : So, can anyone tell me
  2830. : 1) Why malloc is giving me memory that is already in use,
  2831.  
  2832. What you described sounds very strange indeed.  What compiler/linker setup
  2833. are you using.  I have never seen this behaviour with either CW5 or MPW C.
  2834.  
  2835. : 2) How I can get it to give me my own memory rather than someone else's
  2836.  
  2837. It should do that.  Something else is wrong here.
  2838.  
  2839. : 3) Would I be better off just using NewPtr (time isn't critical here) and
  2840. : changing it to malloc for the UNIX implementation
  2841.  
  2842. This question is a good one.  I have talked with several people who have
  2843. told me different things.  If speed is not important, and portability is, I
  2844. would use malloc (assuming that it is working properly).  malloc will give
  2845. you a pointer just like NewPtr will.  If speed is important, then I can't
  2846. answer the question for you.  I am using NewPtr in my apps, but I have put
  2847. a wrapper around all of my memory allocation and free calls so that I can
  2848. change the method of allocation easily.  (I can also track down annoying
  2849. little memory problems this way too!).
  2850.  
  2851. --
  2852. -Mark Allender
  2853. -Parallax Software
  2854. -allender@prairienet.org
  2855.  
  2856. +++++++++++++++++++++++++++
  2857.  
  2858. >From Hank.Dolben@UNH.edu (Hank Dolben)
  2859. Date: Thu, 18 May 1995 16:11:03 -0400
  2860. Organization: University of New Hampshire
  2861.  
  2862. In article <schmeul-1705951234020001@162.48.124.18>, schmeul@umich.edu
  2863. (Sam Huffman) wrote:
  2864.  
  2865. > Can anyone tell me exactly what the difference is between using the ANSI
  2866. > malloc() and the Toolbox NewPtr() for allocating memory?
  2867.  
  2868. I don't know what development system you use. In the THINK C ANSI library
  2869. (the version I have), malloc is implemented by calling NewPtr. So, it's
  2870. *not* more efficient. I use malloc for "portable" code and NewPtr for
  2871. strictly Mac code to avoid having to include the ANSI library. I haven't
  2872. had any trouble with malloc when I've used it. Maybe a time bomb went off
  2873. for you, i.e., a bug may still be lurking in your code (that's always a
  2874. safe bet isn't it? :-).
  2875.  
  2876. Hank Dolben                                   Space Science Center
  2877. Hank.Dolben@UNH.edu                    University of New Hampshire
  2878.  
  2879. +++++++++++++++++++++++++++
  2880.  
  2881. >From Hank.Dolben@UNH.edu (Hank Dolben)
  2882. Date: Fri, 19 May 1995 09:26:16 -0400
  2883. Organization: University of New Hampshire
  2884.  
  2885. In article <Hank.Dolben-1805951611030001@whd.unh.edu>, I wrote:
  2886.  
  2887. > In the THINK C ANSI library (the version I have), malloc is implemented by
  2888. > calling NewPtr. So, it's *not* more efficient.
  2889.  
  2890. OK, that was a bogus thing to say. Excuse me. Of course, it *is* possible
  2891. to improve efficiency by adding a layer of software. I do it all the time.
  2892. In fact, I don't know whether or not the THINK C implementation of malloc
  2893. accomplishes this. I'd have to test it, just as I do my own attempts.
  2894.  
  2895. Hank Dolben                                   Space Science Center
  2896. Hank.Dolben@UNH.edu                    University of New Hampshire
  2897.  
  2898. +++++++++++++++++++++++++++
  2899.  
  2900. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  2901. Date: Fri, 19 May 1995 10:06:08 -0500
  2902. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  2903.  
  2904. In article <3pfgp5$ji@vixen.cso.uiuc.edu>, allender@prairienet.org (Mark
  2905. W. Allender) wrote:
  2906.  
  2907. : Sam Huffman (schmeul@umich.edu) wrote:
  2908. : : So, can anyone tell me
  2909. : : 1) Why malloc is giving me memory that is already in use,
  2910. : What you described sounds very strange indeed.  What compiler/linker setup
  2911. : are you using.  I have never seen this behaviour with either CW5 or MPW C.
  2912. : : 2) How I can get it to give me my own memory rather than someone else's
  2913. : It should do that.  Something else is wrong here.
  2914. : : 3) Would I be better off just using NewPtr (time isn't critical here) and
  2915. : : changing it to malloc for the UNIX implementation
  2916. : This question is a good one.  I have talked with several people who have
  2917. : told me different things.  If speed is not important, and portability is, I
  2918. : would use malloc (assuming that it is working properly).  malloc will give
  2919. : you a pointer just like NewPtr will.  If speed is important, then I can't
  2920. : answer the question for you.  I am using NewPtr in my apps, but I have put
  2921. : a wrapper around all of my memory allocation and free calls so that I can
  2922. : change the method of allocation easily.  (I can also track down annoying
  2923. : little memory problems this way too!).
  2924.  
  2925. malloc is a _lot_ faster than NewPtr() for allocating a lot of small
  2926. objects.  Most implementations of malloc simply call NewPtr() for
  2927. allocation of large objects.
  2928.  
  2929. -- 
  2930. Ken Prehoda, kenp@nmrfam.wisc.edu
  2931.  
  2932. +++++++++++++++++++++++++++
  2933.  
  2934. >From demos@amug.org (Demos)
  2935. Date: Thu, 18 May 1995 23:55:56 -0700
  2936. Organization: University of Utah
  2937.  
  2938. > This question is a good one.  I have talked with several people who have
  2939. > told me different things.  If speed is not important, and portability is, I
  2940. > would use malloc (assuming that it is working properly).  malloc will give
  2941. > you a pointer just like NewPtr will.  If speed is important, then I can't
  2942. > answer the question for you.  I am using NewPtr in my apps, but I have put
  2943. > a wrapper around all of my memory allocation and free calls so that I can
  2944. > change the method of allocation easily.  (I can also track down annoying
  2945. > little memory problems this way too!).
  2946.  
  2947. And the answer is simple:
  2948.  
  2949. If you want your program to be compilable on other platforms - use malloc,
  2950. otherwise - use NewPtr.
  2951.  
  2952. Demos
  2953.  
  2954. _____________________________________________________________________
  2955. Demos <demos@amug.org>   |  IRC: #macdev  |  ftp://amug.org/pub/demos
  2956.  
  2957. +++++++++++++++++++++++++++
  2958.  
  2959. >From kenp@nmrfam.wisc.edu (Ken Prehoda)
  2960. Date: Fri, 19 May 1995 13:25:38 -0500
  2961. Organization: Univ of Wisc-Madison, Dept of Biochemistry
  2962.  
  2963. In article <demos-1805952355560001@chem-31.chem.utah.edu>, demos@amug.org
  2964. (Demos) wrote:
  2965.  
  2966. : > This question is a good one.  I have talked with several people who have
  2967. : > told me different things.  If speed is not important, and portability is, I
  2968. : > would use malloc (assuming that it is working properly).  malloc will give
  2969. : > you a pointer just like NewPtr will.  If speed is important, then I can't
  2970. : > answer the question for you.  I am using NewPtr in my apps, but I have put
  2971. : > a wrapper around all of my memory allocation and free calls so that I can
  2972. : > change the method of allocation easily.  (I can also track down annoying
  2973. : > little memory problems this way too!).
  2974. : And the answer is simple:
  2975. : If you want your program to be compilable on other platforms - use malloc,
  2976. : otherwise - use NewPtr.
  2977. : Demos
  2978. : _____________________________________________________________________
  2979. : Demos <demos@amug.org>   |  IRC: #macdev  |  ftp://amug.org/pub/demos
  2980.  
  2981. No, it's not quite that simple.  If you program allocates a lot of small
  2982. objects, then allocate them using malloc.  Do you use operator new when
  2983. you use C++?  If so (and you are not overriding it), then you are using a
  2984. memory system similar to malloc (if not malloc itself).  In fact, if you
  2985. want to see just how slow NewPtr is, override operator new to just call
  2986. NewPtr.  If your program has many memory allocations at all, there will be
  2987. a very noticable difference.
  2988.  
  2989. -- 
  2990. Ken Prehoda, kenp@nmrfam.wisc.edu
  2991.  
  2992. +++++++++++++++++++++++++++
  2993.  
  2994. >From Narayanan Lakshmanan <narayanan.lakshmanan@hec.mcdermott.com>
  2995. Date: 22 May 1995 14:31:30 GMT
  2996. Organization: McDermott, Inc.
  2997.  
  2998. First, I have never had malloc return memory that is "in-use", thus I 
  2999. suggest you look for a bug, perhaps in converting between 
  3000. shorts/ints/longs, etc.  I have had that problem creep up when 
  3001. programmers assumed too much, especially in unix/mac conversions.
  3002.  
  3003. Second, it is important to note that malloc had an upper limit beyond 
  3004. which it could not allocate a single memory block.  I have not tested 
  3005. this recently, so I cannot give you all the details.  However, when 
  3006. pursuing a similar porting trial, I had to resort to NewPtr in some 
  3007. cases.  Verify this by allocating a single block that is greater than 
  3008. eight megabytes and see if it works for both malloc and NewPtr.
  3009.  
  3010. Third, you really should use NewHandle since it is much faster (weird, 
  3011. but true!) for *larger* blocks.  I have had occassions to allocate 
  3012. tremendous sized blocks, and the same code when rewritten to use 
  3013. NewHandle performed nearly 30% faster.  Unfortunately, I have not gone 
  3014. back to see if this happens on the new Power Macs and their "modern" 
  3015. memory manager.
  3016.  
  3017. -- Nary
  3018.  
  3019.  
  3020.  
  3021. +++++++++++++++++++++++++++
  3022.  
  3023. >From rac@intrigue.com (Robert Coie)
  3024. Date: 22 May 1995 18:24:55 GMT
  3025. Organization: Intrigue Corporation
  3026.  
  3027. In article <3pq782$oaa@trakker.mcdermott.com>, Narayanan Lakshmanan
  3028. <narayanan.lakshmanan@hec.mcdermott.com> wrote:
  3029.  
  3030. : Third, you really should use NewHandle since it is much faster (weird, 
  3031. : but true!) for *larger* blocks.  I have had occassions to allocate 
  3032. : tremendous sized blocks, and the same code when rewritten to use 
  3033. : NewHandle performed nearly 30% faster.  Unfortunately, I have not gone 
  3034. : back to see if this happens on the new Power Macs and their "modern" 
  3035. : memory manager.
  3036.  
  3037. It should.  The reason NewHandle is usually much faster than NewPtr is
  3038. that NewPtr always causes heap compaction, whereas NewHandle only does so
  3039. if the amount of memory requested is not available otherwise.
  3040.  
  3041. Robert Coie                              rac@intrigue.com
  3042. Implementor, Intrigue Corporation     AppleLink: INTRIGUE
  3043.  
  3044. +++++++++++++++++++++++++++
  3045.  
  3046. >From j friend <jfriend@xre2.iii.net>
  3047. Date: 23 May 1995 11:07:45 GMT
  3048. Organization: iii.net
  3049.  
  3050. sstorkel@netcom12.netcom.com (Scott Storkel) wrote:
  3051. > In general, I try to avoid malloc() simply because I don't know what
  3052. > it's going to do (or I do know, and I don't like it :-). I tend to use
  3053. > NewPtr() or write custom allocators that are more efficient than
  3054. > malloc()... 
  3055.  
  3056.  
  3057. careful of this - if you are allocating lots of samll peices of memory
  3058. malloc may be MUCH more efficient than NewPtr because it will make fewer
  3059. calls to NewPtr (which is very expensive) to get large blocks which
  3060. it will then split up for you. In cases like this it can also prevent
  3061. some fragmentation.
  3062.  
  3063. jf
  3064.  
  3065. +++++++++++++++++++++++++++
  3066.  
  3067. >From sstorkel@best.com (Scott Storkel)
  3068. Date: Tue, 23 May 1995 09:24:04 -0700
  3069. Organization: Devious Software & Consulting
  3070.  
  3071. In article <3psfmk$qs8@news.iii.net>, j friend <jfriend@xre2.iii.net> wrote:
  3072.  
  3073. > sstorkel@netcom12.netcom.com (Scott Storkel) wrote:
  3074. > > 
  3075. > > In general, I try to avoid malloc() simply because I don't know what
  3076. > > it's going to do (or I do know, and I don't like it :-). I tend to use
  3077. > > NewPtr() or write custom allocators that are more efficient than
  3078. > > malloc()... 
  3079. > careful of this - if you are allocating lots of samll peices of memory
  3080. > malloc may be MUCH more efficient than NewPtr because it will make fewer
  3081. > calls to NewPtr (which is very expensive) to get large blocks which
  3082. > it will then split up for you. In cases like this it can also prevent
  3083. > some fragmentation.
  3084.  
  3085. Yes, I know. I've made the following observations about programs
  3086. I've seen:
  3087.  
  3088.         They allocate small numbers of randomly sized objects.
  3089.                                 and
  3090.         They allocate large numbers of similarly sized objects.
  3091.  
  3092. For like-sized objects, these are typically the small ones, I use a custom
  3093. allocator which is *much* faster than malloc. For the randomly sized objects,
  3094. I call NewPtr. In general, if I allocate something enough that the performance
  3095. penalty for NewPtr would have an impact, I switch over to the custom allocator.
  3096.  
  3097. I've found this to be a pretty decent solution in most cases. It does require
  3098. more work than blindly calling NewPtr, but the results are generally better.
  3099.  
  3100.  
  3101.                                                                 -- Scott
  3102.  
  3103. +++++++++++++++++++++++++++
  3104.  
  3105. >From Narayanan Lakshmanan <narayanan.lakshmanan@hec.mcdermott.com>
  3106. Date: 24 May 1995 12:59:33 GMT
  3107. Organization: McDermott, Inc.
  3108.  
  3109. >Any reason why you shouldn't allocate [a handle] first, then
  3110. >MoveHHi and lock it so it's at the very top?
  3111. >
  3112. You may not know the size of the data at the beginning of the program.
  3113.  
  3114. -- Nary
  3115.  
  3116.  
  3117.  
  3118. +++++++++++++++++++++++++++
  3119.  
  3120. >From dstone@alchemy.chem.utoronto.ca (David Stone)
  3121. Date: Wed, 24 May 1995 13:53:18 GMT
  3122. Organization: University of Toronto Chemistry
  3123.  
  3124. In article <3pvajl$i60@trakker.mcdermott.com>, Narayanan Lakshmanan
  3125. <narayanan.lakshmanan@hec.mcdermott.com> wrote:
  3126. > >Any reason why you shouldn't allocate [a handle] first, then
  3127. > >MoveHHi and lock it so it's at the very top?
  3128. > >
  3129. > You may not know the size of the data at the beginning of the program.
  3130. > -- Nary
  3131.  
  3132. Actually, I do - and it's there from startup to quitting time.  (I use the
  3133. sizeof() function on my data type to do the allocation).  So I guess
  3134. there's
  3135. nothing wrong with this approach, then?
  3136.  
  3137. Dave Stone
  3138.  
  3139. +++++++++++++++++++++++++++
  3140.  
  3141. >From Duane Murphy <Duane_Murphy@Novell.Com>
  3142. Date: 24 May 1995 14:32:34 GMT
  3143. Organization: Novell, Inc.
  3144.  
  3145. In article <dstone-240595095735@csgmac.chem.utoronto.ca> David Stone,
  3146. dstone@alchemy.chem.utoronto.ca writes:
  3147. >Actually, I do - and it's there from startup to quitting time.  (I use the
  3148. >sizeof() function on my data type to do the allocation).  So I guess
  3149. >there's
  3150. >nothing wrong with this approach, then?
  3151. >
  3152.  
  3153. Normally, handles are used for data that is transient in nature or that 
  3154. can float. Transient in the sense that you allocate it, use it for a 
  3155. period of time and then deallocate it. The period of time is not as 
  3156. interesting as how the data is accessed. 
  3157.  
  3158. In my opinion, the floating nature is more interesting. If the data can 
  3159. be allowed to move around in memory then you get the full benefit of 
  3160. handles.
  3161.  
  3162. In your specific case where the data will be allocated at startup and be 
  3163. locked for the duration, then there are two other approaches that you 
  3164. might consider. 
  3165.  
  3166. 1. Use NewPtr. This puts the data LOW and out of the way. If you are 
  3167. doing this at startup then it will be very low.
  3168.  
  3169. 2. Use ReserveMem and NewHandle. Again this puts the memory low. 
  3170.  
  3171. MoveHHI is appropriate if the time period for use of the data is 
  3172. reasonably long _AND_ the data has to be locked (transient code resources 
  3173. like XCMD's). Reasonably long is usually considered shorter than the 
  3174. existance of the application ;-)
  3175.  
  3176. Be aware. Copland Memory Managment will make the use of pointers (NewPtr) 
  3177. far more efficient. Handles will still be used (they do have there place) 
  3178. but there are significant advantages to pointers in Copland.
  3179.  
  3180. Hope this helps,
  3181.  
  3182.  +-------------------------+--------------------------------------------+
  3183.  | Duane Murphy            | My opinions are mine, mine, and only mine; |
  3184.  | Duane_Murphy@Novell.com |      Except when they are also yours.      |
  3185.  +-------------------------+--------------------------------------------+
  3186.  
  3187. ---------------------------
  3188.  
  3189. >From rclayton@yorick.umd.edu (Rodney Clayton)
  3190. Subject: newbie. How to get open file dialog box.
  3191. Date: 23 May 1995 14:56:40 GMT
  3192. Organization: University of Maryland, College Park
  3193.  
  3194. I have an application I ported from pc/dos. I would like to open
  3195. files for input and output and have the mac generate the dialog 
  3196. box it usualy presents for most other applications. How do I go 
  3197. about doing this? I am using semantec c++. 
  3198. Thank's Rod
  3199.  
  3200. +++++++++++++++++++++++++++
  3201.  
  3202. >From uminger@mcs.drexel.edu (Lord of the Sith)
  3203. Date: Tue, 23 May 95 18:21:05 GMT
  3204. Organization: Drexel University, Dept. of Math. and Comp. Sci.
  3205.  
  3206. Rodney Clayton (rclayton@yorick.umd.edu) wrote:
  3207. : I have an application I ported from pc/dos. I would like to open
  3208. : files for input and output and have the mac generate the dialog       
  3209. : box it usualy presents for most other applications. How do I go 
  3210. : about doing this? I am using semantec c++. 
  3211. : Thank's Rod
  3212.  
  3213. StandardGetFile();
  3214.  
  3215. I'm not sure of the parameter list right now, as I don't have books with me,
  3216. but one of them is a StandardFileReply *  which has as one it's members,
  3217. an FSSpec, which is the basic way to identify a file on the macintosh.
  3218.  
  3219. --
  3220. Matt Inger
  3221. uminger@mcs.drexel.edu
  3222. http://mcs.drexel.edu/~uminger/
  3223. "Remember when you were young?  You shone like the sun."
  3224.  
  3225. +++++++++++++++++++++++++++
  3226.  
  3227. >From rclayton@yorick.umd.edu (Rodney Clayton)
  3228. Date: 23 May 1995 20:14:44 GMT
  3229. Organization: University of Maryland, College Park
  3230.  
  3231. Lord of the Sith (uminger@mcs.drexel.edu) wrote:
  3232. : Rodney Clayton (rclayton@yorick.umd.edu) wrote:
  3233. : : I have an application I ported from pc/dos. I would like to open
  3234. : : files for input and output and have the mac generate the dialog     
  3235. : : box it usualy presents for most other applications. How do I go 
  3236. : : about doing this? I am using semantec c++. 
  3237. : : Thank's Rod
  3238.  
  3239. : StandardGetFile();
  3240.  
  3241. : I'm not sure of the parameter list right now, as I don't have books with me,
  3242. : but one of them is a StandardFileReply *  which has as one it's members,
  3243. : an FSSpec, which is the basic way to identify a file on the macintosh.
  3244.  
  3245. : --
  3246. : Matt Inger
  3247. : uminger@mcs.drexel.edu
  3248. : http://mcs.drexel.edu/~uminger/
  3249. : "Remember when you were young?  You shone like the sun."
  3250. I was looking at the new INSIDE MACINTOSH books in the book store the   
  3251. other day. Do you happen to know which one this stuff would be in?
  3252.  
  3253.  
  3254. +++++++++++++++++++++++++++
  3255.  
  3256. >From andrew@adcode.demon.co.uk (Andrew)
  3257. Date: 24 May 1995 00:50:13 +0100
  3258. Organization: Adcode
  3259.  
  3260. In article <1995May23.182105.475@mcs.drexel.edu>, uminger@mcs.drexel.edu
  3261. (Lord of the Sith) wrote:
  3262.  
  3263. > Rodney Clayton (rclayton@yorick.umd.edu) wrote:
  3264. > : I would like to open files for input and output and have the mac generate 
  3265. > : the dialog box it usualy presents for most other applications. How do I go 
  3266. > : about doing this?
  3267.  
  3268. When you say 'usually', it should always do this. That's what makes the
  3269. mac the dog's bo**ocks. Mac programmers use the Mac toolbox where possible
  3270. to make this kind of thing happen and that's why all (well-behaved)
  3271. applications have a standard window (unlike windows apps).
  3272.  
  3273. Here's how to do it:
  3274.  
  3275. typedef OSType       SFTypeList[4] // unless your compiler has this type 
  3276.  
  3277. OSErr GetTheFile (FSSpec &TheSpec)
  3278. {
  3279. StandardFileReply    Reply;    // holds the reply from dialog
  3280. OSType               TList     // The file types we are looking for
  3281. FileFilterProc       FFilter   // optional file filter
  3282. short                Ntps      // number of types in TList
  3283.  
  3284.                      FFilter = nil // see note on filter
  3285.                      Ntps = 1      // we'll look at one type (see note)
  3286.                      TList[0] = 'FFIL' // just look at type 1 fonts
  3287.  
  3288.                      StandardGetFile(FFilter,  Ntps, TList, &Reply);
  3289.                      if (Reply.sfGood) // ie., user did not cancel
  3290.                            {
  3291.                            TheSpec = Reply.sfFile;
  3292.                            return noErr;
  3293.                            }
  3294.                      else
  3295.                            return -43; // ie., file not found
  3296. }
  3297.  
  3298.  
  3299.  
  3300. Other things in Reply are sfType (Type of file), sfFlags (finder flags of
  3301. file), sfScript (Script of file - though just use zero)
  3302.  
  3303. Standard file is the standard way of getting a file. To get a folder is a
  3304. little more involved.
  3305.  
  3306. The parameters to standard file are as follows:
  3307.  
  3308. File filter function pointer: Use nil to ignore it but it allows you to
  3309. use your own procedure for working out whether or not each item in the
  3310. list is to be greyed out or selectable. It is useful if you are compiling
  3311. a list of files and do not want the ones already selected to be
  3312. re-selectable (if that's a word). Also useful for a 'get folder' routine -
  3313. mre of that later.
  3314.  
  3315. Number of file types - use zero to select from no files - sounds Irish but
  3316. is useful for selecting folders. To do this, e-mail me. It's a B'stard.
  3317. Use -1 to select from all file types.
  3318.  
  3319. Type list: An array of longs which hold the types you are searching for:
  3320. Fill out at least what you have specified in Number of File Types.
  3321.  
  3322. Pointer to reply structure - useful parameters shown above.
  3323.  
  3324. That's it really. The resulting reply can be used to operate on a file
  3325. using the System 7 FS traps, or split off the vRefNum, DirID and name from
  3326. the record and use the H traps instead.
  3327.  
  3328. Good luck with the app, Andrew.
  3329.  
  3330. -- 
  3331. Andrew Crane, Egham, Surrey, England <andrew@adcode.demon.co.uk>
  3332.  
  3333. ---------------------------
  3334.  
  3335. End of C.S.M.P. Digest
  3336. **********************
  3337.